2次元の配列

2つの添字付き変数

プログラムのはじめに DIM A(3,2) と書くと,A(1,1),A(1,2),A(2,1),A(2,2),A(3,1),A(3,2) の計6個の変数が用意されます。それぞれ,普通の変数として使えます。この様に添え字が2つになるものを2次元の配列といいます。3次元の配列まで使用することができます。

添え字は習慣として、n や i j k が使われますが、意味のわかりやすい変数にした方がいいでしょう。

uriage(mon,day) ←月と日で日ごとの売り上げを登録する配列
ten(n,kamoku)   ←回数と科目で試験の成績を登録する配列
                   kai,kamoku でもいいが頭文字が同じなので n回と考えた
name$(HR,N)     ←HR と番号で名前を登録する配列

文字変数の場合は先に$がくることを忘れないでください。

縦横の合計と平均

代入部分

入力や合計計算で繰り返しが二重になるのでプログラムはどうしても複雑になります。

まず代入部分です。DATAに並んでいるデータの順番と、 n , kamoku の for next の順番があっていなければおかしなことになります。赤い数字が1回目であれば次のようになります。

DATA 78,45,65,63,57,82,75
DATA 74,50,73,68,68,86,77
DATA 72,48,76,60,70,80,84
DIM ten(3,7)
FOR n = 1 To 3
   FOR kamoku = 1 To 7
      READ ten(n,kamoku)
   NEXT kamoku
NEXT n

科目数や回数は後の処理でも何度もでてくる数字ですから変数にしておいた方が便利です。回数が4回に増えても1カ所直すだけですみますし、3というのが何の数字かわからなくなることがありません。たとえば、

DATA 78,45,65,63,57,82,75
DATA 74,50,73,68,68,86,77
DATA 72,48,76,60,70,80,84
nmax=3
kamokumax=7
DIM ten(nmax,kamokumax)
FOR n = 1 To nmax
   FOR kamoku = 1 To kamokumax
      READ ten(n,kamoku)
   NEXT kamoku
NEXT n

回ごと集計・表示部分

回ごとの合計・平均を出します。データを書き出してからその後ろに合計・平均を書き出しています。sum=0 の位置に注意。

FOR n = 1 To nmax
   sum=0
   FOR kamoku = 1 To kamokumax
      PRINT ten(n,kamoku);
      LET  sum = sum + ten(n,kamoku)
   NEXT kamoku
   PRINT " 合計:"; sum;
   PRINT " 平均:"; ROUND(sum / kamokumax, 1)
NEXT n

結果は次のようになります。

 78  45  65  63  57  82  75  合計: 465  平均: 66.4 
 74  50  73  68  68  86  77  合計: 496  平均: 70.9 
 72  48  76  60  70  80  84  合計: 490  平均: 70 

科目ごと集計・表示部分

科目ごとの平均を出します。データは書き出さずに、結果だけを縦に並べています。

FOR kamoku = 1 To kamokumax
   sum=0
   FOR n = 1 To nmax
      LET  sum = sum + ten(n,kamoku)
   NEXT n
   PRINT "科目"; kamoku;
   PRINT "平均 :"; ROUND(sum / nmax, 1)
NEXT kamoku

結果は次のようになります。

科目 1 平均: 74.7 
科目 2 平均: 47.7 
科目 3 平均: 71.3 
科目 4 平均: 63.7 
科目 5 平均: 65 
科目 6 平均: 82.7 
科目 7 平均: 78.7 

例31

上記3つの部分をつなげてプログラムを完成させなさい。

例32

もっと一般的な表の形につくる場合はどうすればよいでしょうか。つまりこんな感じに仕上げたい場合です。

このためには科目名などの表示を先にしておきます。

PRINT "    ";
PRINT " 国語 地歴 公民 数学 化学 生物 英語";
PRINT " 合計 平均"

これはもちろん、前もって kamokumei$(1)="国語"とかセットしてから for-next で表示してもかまいません。また、DATA 国語 地歴 公民 … としておいて、read kamkoumei$(n) でセットしてから for-next で表示してもかまいません。ただし難しくなります。

数字部分は USING を使ってそろえます。

PRINT USING "####": n;

これは4桁に右寄せで入れるという指定です。4桁に満たなければ空白になります。

PRINT USING " ####":ten(n,kamoku);
PRINT USING " ####": sum;

これは1桁の空白を入れて以下の4桁に右寄せで入れるという指定です。4桁に満たなければ空白になります。

PRINT USING " ##.#": ROUND(sum / kamokumax, 1)

これは1桁の空白を入れて以下2桁の整数部分の後、1桁の少数部分をつけるという指定です。

科目ごとの平均のためには、次の文を適当なところに使って修正する必要がでてきます。一番下の行の"平均"の表示です。

PRINT "平均"; 
PRINT USING " ##.#": ROUND(sum / nmax, 1);

聖愛高等学校
http://www.seiai.ed.jp/