5. 1 配列 5. 2 練習問題 5. 3 多次元配列 5. 4 練習問題 5. 5 合計の計算 5. 6 練習問題 5. 7 最小の計算 5. 8 練習問題 5. 9 宿題 5.10 おまけ
SFC の学年ごとの在籍者数のグラフを作ってみましょう。1999年度春学期のデータは次のようになっています。
| 第1学年 | 1020 |
| 第2学年 | 1064 |
| 第3学年 | 932 |
| 第4学年 | 1103 |
これを変数に記憶するとき、それぞれ別の変数に記憶することもできます。
int studentFirst = 1020;
int studentSecond = 1064;
int studentThird = 932;
int studentFourth = 1103;
しかし、このようにすると、1年から4年まで繰り返して同じ処理をしたいときに困ってしまいます。
for (int year = 0; year < 4; year = year + 1) {
変数 student??? を使う処理
}
(year の値が 0 から 3 までなのは、後の都合によるものです。)
上の student??? の部分を、その時の year の値で決めることができるようにするためには、配列を使います。配列(array)とは、同じ型のデータを複数個並べたものです。この場合は、4個の整数を並べた配列を作り、それを配列変数 student に記憶します。

この中のデータを取り出したり、変更したりする時は、student の後に '[ ]' で囲んで、何番目のデータかということを書きます。これを添字(index)と呼びます。添字は 0 から始まることに注意してください。例えば、student[year] と書くと、year の値が変化するにしたがって、student[0] から student[3] を順番に使うことができます。
for (int year = 0; year < 4; year = year + 1) {
変数 student[year] を使う処理
}
それでは、グラフを書くプログラムを作ってみましょう。図形を描くので、SfcTemplate2.java, SfcTemplate2.html をコピーしてStudentGraph.java, StudentGraph.html を作ります。
45 46 47 48 49 50 51 52 53 54 55 56 |
void sfcDraw(Graphics g) {
//ここに自分のプログラムを書く
int student[] = { 1020, 1064, 932, 1103 }; // データを配列に記憶する
for ( int year = 0; year < 4; year = year + 1 ) { // yearが0から3まで
graph(g, year, student[year]); // graphの呼び出し
}
}
void graph(Graphics g, int year, int number) {
int height = number * 300 / 1200; // 1200人の時300ピクセルになるように
g.fillRect( year * 60 + 30, 300 - height, 30, height );
}
|
配列変数宣言の書き方は次のようになります。
型 変数名[] = { データ, … };
または
型[] 変数名 = { データ, … };
new 型[配列の大きさ]で作ることができます。例えば、整数を4個記憶する配列を配列変数 p に入れるには、
int p[] = new int[4];とします。
p[添字] = 新しい値;で一つずつ変更していきます。
在籍者数の学部別のデータは次のようになっています。
| 総合 | 環境 | |
| 第1学年 | 502 | 518 |
| 第2学年 | 532 | 532 |
| 第3学年 | 479 | 453 |
| 第4学年 | 568 | 535 |
配列変数 pStudent と eStudent を使って、次のようなグラフを描くプログラムを作りなさい。
青色でグラフを描くには、図形を描く前に
g.setColor(Color.blue);を実行します。緑色なら
g.setColor(Color.green);です。詳しくはこちらを見てください。
配列はデータを1次元的に並べたものですが、配列の中に配列を入れることによって、2次元の表を扱うこともできます。
在籍者数を男女別にも分けると次のようになります。
| 総合男 | 総合女 | 環境男 | 環境女 | |
| 第1学年 | 321 | 181 | 351 | 167 |
| 第2学年 | 330 | 202 | 363 | 169 |
| 第3学年 | 300 | 179 | 302 | 151 |
| 第4学年 | 341 | 227 | 368 | 167 |
上のプログラムでの配列変数 student の要素は各学年の人数を表す整数データでしたが、今度はそれぞれの学年の {総合男の人数, 総合女の人数, 環境男の人数, 環境女の人数} という配列になります。
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
void sfcDraw(Graphics g) {
//ここに自分のプログラムを書く
int student[][] = { { 321, 181, 351, 167 },
{ 330, 202, 363, 169 },
{ 300, 179, 302, 151 },
{ 341, 227, 368, 167 } }; // データを配列に記憶する
for ( int year = 0; year < 4; year = year + 1 ) { // yearが0から3まで
for ( int section = 0; section < 4; section = section + 1 ) {
// section 0:総合男, 1:総合女, 2:環境男, 3:環境女
graph(g, year, section, student[year][section]);
}
}
}
void graph(Graphics g, int year, int section, int number) {
Color c[] = { Color.green, Color.orange, Color.blue, Color.red };
int height = number * 300 / 400; // 400人の時300ピクセルになるように
g.setColor(c[section]); // 総・環, 男・女で色を変える
g.fillRect(year*60+section*10+30, 300-height, 10, height);
}
|
1から4までの数字を入力し、その学年の総合男の人数, 総合女の人数, 環境男の人数, 環境女の人数をグラフにするプログラムを書きなさい。
上のデータを使って、SFC に合計何人の学生がいるかを計算してみましょう。今度は出力が文字になりますから、SfcTemplate1.java,SfcTemplate1.html を StudentNumber.java,StudentNumber.html にコピーして下さい。
5.5 合計の計算
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
void sfcProcess () {
//ここに自分のプログラムを書く
int student[][] = { { 321, 181, 351, 167 },
{ 330, 202, 363, 169 },
{ 300, 179, 302, 151 },
{ 341, 227, 368, 167 } }; // データを配列に記憶する
int sum = 0; // 合計を覚えておく変数
for ( int year = 0; year < 4; year = year + 1 ) { // yearが0から3まで
for ( int section = 0; section < 4; section = section + 1 ) {
// section 0:総合男, 1:総合女, 2:環境男, 3:環境女
sum = sum + student[year][section];
}
}
sfcOutput(String.valueOf(sum));
}
|
上のプログラムでどうして合計が計算できるのか、考えなさい。
(ヒント) 繰り返しによって、変数の値がどう変化するか、次の表の空欄を埋めてみなさい。
| year | section | sum |
|---|---|---|
| - | - | 0 |
| 0 | 0 | 321 |
| 0 | 1 | |
今度は、一番人数の少ないグループはどれか、調べてみましょう。
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
void sfcProcess () {
//ここに自分のプログラムを書く
int student[][] = { { 321, 181, 351, 167 },
{ 330, 202, 363, 169 },
{ 300, 179, 302, 151 },
{ 341, 227, 368, 167 } }; // データを配列に記憶する
String group[] = { "総合男", "総合女", "環境男", "環境女" };
int min = student[0][0]; // 最小の人数を覚えておく変数
int minYear = 0, minSection = 0; // 最小の人数がどれだったか覚えておく変数
// 最初はとりあえず1年総合男の321人を覚えておく
for ( int year = 0; year < 4; year = year + 1 ) {
for ( int section = 0; section < 4; section = section + 1 ) {
if ( min > student[year][section] ) { // 今までの最小より小さいか?
min = student[year][section]; // 新しい最小値を記憶する
minYear = year; // 新しい最小値の学年を記憶する
minSection = section; // 新しい最小値の種別を記憶する
}
}
}
sfcOutput(String.valueOf(minYear+1)+"年"+group[minSection]+" "
+String.valueOf(min)+"人");
}
|
このプログラムは日本語の文字列を使っています。その場合は、プログラムを書く時に使用した文字コードを、コンパイルする時に -encoding オプションで指定しなければなりません。CNS では iso-2022-jp (いわゆる JIS コード)が標準ですので、それを使って書いた場合は
% javac -encoding JIS StudentNumber.javaとします。euc-jp の場合は EUC、シフトJISの場合はSJIS を指定します。 |
上のプログラムでどうして最小が計算できるのか、考えなさい。
(ヒント) 繰り返しによって、変数の値がどう変化するか、次の表の空欄を埋めてみなさい。
| year | section | min | minYear | minSection |
|---|---|---|---|---|
| - | - | 321 | 0 | 0 |
| 0 | 0 | 321 | 0 | 0 |
| 0 | 1 | |||
総合男、総合女、環境男、環境女のそれぞれについて、1年から4年の合計を計算し、次のように表示するプログラムを書きなさい。
1292,789,1384,654
蛇足: year とsection を変化させる順番を逆にすると、合計を覚えておくための配列を使わずに書くこともできます。
英語の月の名前を入力し、それが何月かを数字で出力するプログラムを作ってみましょう。正しく月の名前を入力しなかった時は、"Wrong month name!" と表示するようにしなさい。
5.10 おまけ
変数.equals(文字列)
で判定できます。結果は boolean 型(等しければ true)になります。
[目次]
[前回]
[次回]
[重要語索引]
慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学