== 配列 ==
配列の要素の参照や要素への値の代入などでの要素の指定方法は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がある値を超えるとうまく処理されなくなります。
理由を考えてください。