== 配列 == 配列の要素の参照や要素への値の代入などでの要素の指定方法はCと同じです。 {{{ a[0] = 1; a[1] = a[0] + 2; }}} ---- === 配列の大きさ === 配列の大きさは length で得ることができる。 配列の宣言と使い始めに必要な処理は異なります。 '''例''' {{{#!java int[] a; a = new int[100]; for (i = 0; i < a.length; i++) a[i] = 0; }}} 1行目の変数宣言 int[ ] a; により、変数aの場所が用意される。 <
>a の型は int[ ] (すなわち int型の配列)であるが、変数aのために用意されるのは参照型の値が入る箱1つだけである。 {{attachment:hairetu1.png}} 2行目の new int[100] により、int型のデータが100個並んだオブジェクトが作られる。 {{attachment:hairetu2.png}} それを a に代入することで、aを使って配列の各要素を参照できるようになる。 {{attachment:hairetu3.png}} 3~4行目では配列の要素に0を代入している。 <
>aが参照している配列の大きさは a.length で得ることができ、繰り返しの中で利用している。 変数aの定義と配列オブジェクトの作成が別々になっていることに注意。 配列オブジェクトは実行時に作成されるので、配列の実際の大きさも(コンパイル時でなく)実行時に決まることになる。 3~4行目で用いられている変数iの宣言も必要だが(説明と関係ないので)省略した。 ---- === 演習 === 次のCで書かれたプログラムはエラトステネスの篩を用いて1000までの素数を表示するものです。 {{{#!java #include #define N 1000 int main() { int i, p, w[N]; for (i = 0; i < N; i++) w[i] = 1; for (p = 2; p < N; p++) { if ( w[p] ) { printf("%8d", p); for ( i = 2*p; i < N; i += p) w[i] = 0; } } } }}} これをもとにして、Javaのプログラムを作成しなさい。 * ファイル名はLesson3.javaとすること。 * 慣習に従って、美しいプログラムにすること。 * Nは定数として記述しなさい。 . Nを別の値にしたいときは、定数記述の1箇所だけの修正ですむようにすること。 * wをboolean型配列として宣言し、サイズNで割り当てなさい。 * wの配列要素に値を代入しているところが2箇所あります。 . 正しいbooleanの値を代入するように修正しなさい。 * その他、必要な修正を行って正しく動作するようにしなさい。 (1) {{{ 上のCプログラムと同じ動作をするプログラムを作成しなさい。 }}} (2) {{{ 求まった素数の個数と、求まった素数のうち最大のもの1つだけを表示するように修正しなさい。 }}} (3) {{{ あなたが使っているJava処理系で、どのくらい大きなNまで処理できるか調べなさい。 }}} 上級では次の点を調べる必要があります。 1. コンパイルできること。 1. 配列をnewで確保できること。 1. ある程度の時間内に実行できること。 1. 正しく処理されること。 java コマンドにヒープサイズオプションをつけて実行すると 大きな配列を確保することができます。 . > java -Xmx500m Lesson3 . 大文字Xと小文字xに注意 . 500m の部分に使用するヒープメモリサイズを書く 演習用サーバを使っている人はlinuxのコマンドを使って実行時間を計測することができるので、 いくつかのNについて調べてみると良いでしょう。 . > time java Lesson3 1~3を解決してもこのプログラムでは、Nがある値を超えるとうまく処理されなくなります。 理由を考えてください。