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 慶應義塾大学