[目次] [前回] [次回] [重要語索引]

第5週: たくさんのデータ

5. 1 配列
5. 2 練習問題
5. 3 多次元配列
5. 4 練習問題
5. 5 合計の計算
5. 6 練習問題
5. 7 最小の計算
5. 8 練習問題
5. 9 宿題
5.10 おまけ

5.1 配列

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 );
    }

配列変数宣言の書き方は次のようになります。

    型 変数名[] = { データ, … };
または
    型[] 変数名 = { データ, … };

5.2 練習問題

在籍者数の学部別のデータは次のようになっています。
総合環境
第1学年502518
第2学年532532
第3学年479453
第4学年568535

配列変数 pStudenteStudent を使って、次のようなグラフを描くプログラムを作りなさい。

総合と環境の学生数

青色でグラフを描くには、図形を描く前に

     g.setColor(Color.blue);
を実行します。緑色なら
     g.setColor(Color.green);
です。詳しくは
こちらを見てください。

5.3 多次元配列

配列はデータを1次元的に並べたものですが、配列の中に配列を入れることによって、2次元の表を扱うこともできます。

在籍者数を男女別にも分けると次のようになります。
総合男総合女環境男環境女
第1学年321181351167
第2学年330202363169
第3学年300179302151
第4学年341227368167

上のプログラムでの配列変数 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);
    }

5.4 練習問題

1から4までの数字を入力し、その学年の総合男の人数, 総合女の人数, 環境男の人数, 環境女の人数をグラフにするプログラムを書きなさい。

5.5 合計の計算

上のデータを使って、SFC に合計何人の学生がいるかを計算してみましょう。今度は出力が文字になりますから、SfcTemplate1.java,SfcTemplate1.htmlStudentNumber.java,StudentNumber.html にコピーして下さい。
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));
    }

5.6 練習問題

上のプログラムでどうして合計が計算できるのか、考えなさい。

(ヒント) 繰り返しによって、変数の値がどう変化するか、次の表の空欄を埋めてみなさい。
yearsectionsum
--0
00321
01 
   
   
   
   

5.7 最小の計算

今度は、一番人数の少ないグループはどれか、調べてみましょう。
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 を指定します。

5.8 練習問題

上のプログラムでどうして最小が計算できるのか、考えなさい。

(ヒント) 繰り返しによって、変数の値がどう変化するか、次の表の空欄を埋めてみなさい。
yearsectionminminYearminSection
--32100
0032100
01   
     
     
     
     

5.9 宿題

総合男、総合女、環境男、環境女のそれぞれについて、1年から4年の合計を計算し、次のように表示するプログラムを書きなさい。

     1292,789,1384,654

蛇足: yearsection を変化させる順番を逆にすると、合計を覚えておくための配列を使わずに書くこともできます。

5.10 おまけ

英語の月の名前を入力し、それが何月かを数字で出力するプログラムを作ってみましょう。正しく月の名前を入力しなかった時は、"Wrong month name!" と表示するようにしなさい。

実行例


[目次] [前回] [次回] [重要語索引]

慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学