1811
コメント:
|
← 2012-03-22 01:41:33時点のリビジョン27 ⇥
4073
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 9: | 行 9: |
---- === 配列の大きさ === 配列の大きさは length で得ることができる。 |
|
行 16: | 行 22: |
for (int i = 0; i < a.length; i++) | for (i = 0; i < a.length; i++) |
行 34: | 行 40: |
3~4行目で用いられている変数iの宣言も必要だが(説明と関係ないので)省略した。 | |
行 35: | 行 42: |
配列の宣言は | === 演習 === 次のCで書かれたプログラムはエラトステネスの篩を用いて1000までの素数を表示するものです。 {{{#!java #include <stdio.h> #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) |
行 37: | 行 75: |
int[] a; | 上のCプログラムと同じ動作をするプログラムを作成しなさい。 |
行 39: | 行 77: |
ではなく | (2) |
行 41: | 行 80: |
int a[]; | 求まった素数の個数と、求まった素数のうち最大のもの1つだけを表示するように修正しなさい。 |
行 43: | 行 82: |
と書く方法もあります。 | |
行 45: | 行 83: |
1番目の書き方は'''int配列型の変数a'''、 2番目の書き方は'''int型aの配列''' と読めます。 どちらでもかまわないのですが、1番目の方がなんとなくオブジェクトっぽくて、 説明の図とあっているように見えませんか。 |
(3) {{{ あなたが使っているJava処理系で、どのくらい大きなNまで処理できるか調べなさい。 }}} 上級では次の点を調べる必要があります。 1. コンパイルできること。 1. 配列をnewで確保できること。 1. ある程度の時間内に実行できること。 1. 正しく処理されること。 java コマンドにヒープサイズオプションをつけて実行すると 大きな配列を確保することができます。 . > java -Xmx500m Lesson3 . 大文字Xと小文字xに注意 . 500m の部分に使用するヒープメモリサイズを書く 演習用サーバを使っている人はlinuxのコマンドを使って実行時間を計測することができるので、 いくつかのNについて調べてみると良いでしょう。 . > time java Lesson3 1~3を解決してもこのプログラムでは、Nがある値を超えるとうまく処理されなくなります。 理由を考えてください。 |
配列
配列の要素の参照や要素への値の代入などでの要素の指定方法はCと同じです。
a[0] = 1; a[1] = a[0] + 2;
配列の大きさ
配列の大きさは length で得ることができる。
配列の宣言と使い始めに必要な処理は異なります。
例
1行目の変数宣言 int[ ] a; により、変数aの場所が用意される。
a の型は int[ ] (すなわち int型の配列)であるが、変数aのために用意されるのは参照型の値が入る箱1つだけである。
2行目の new int[100] により、int型のデータが100個並んだオブジェクトが作られる。
それを a に代入することで、aを使って配列の各要素を参照できるようになる。
3~4行目では配列の要素に0を代入している。
aが参照している配列の大きさは a.length で得ることができ、繰り返しの中で利用している。
変数aの定義と配列オブジェクトの作成が別々になっていることに注意。
配列オブジェクトは実行時に作成されるので、配列の実際の大きさも(コンパイル時でなく)実行時に決まることになる。
3~4行目で用いられている変数iの宣言も必要だが(説明と関係ないので)省略した。
演習
次のCで書かれたプログラムはエラトステネスの篩を用いて1000までの素数を表示するものです。
これをもとにして、Javaのプログラムを作成しなさい。
- ファイル名はLesson3.javaとすること。
- 慣習に従って、美しいプログラムにすること。
- Nは定数として記述しなさい。
- Nを別の値にしたいときは、定数記述の1箇所だけの修正ですむようにすること。
- wをboolean型配列として宣言し、サイズNで割り当てなさい。
- wの配列要素に値を代入しているところが2箇所あります。
- 正しいbooleanの値を代入するように修正しなさい。
- その他、必要な修正を行って正しく動作するようにしなさい。
(1)
上のCプログラムと同じ動作をするプログラムを作成しなさい。
(2)
求まった素数の個数と、求まった素数のうち最大のもの1つだけを表示するように修正しなさい。
(3)
あなたが使っているJava処理系で、どのくらい大きなNまで処理できるか調べなさい。
上級では次の点を調べる必要があります。
- コンパイルできること。
- 配列をnewで確保できること。
- ある程度の時間内に実行できること。
- 正しく処理されること。
java コマンドにヒープサイズオプションをつけて実行すると 大きな配列を確保することができます。
> java -Xmx500m Lesson3
- 大文字Xと小文字xに注意
- 500m の部分に使用するヒープメモリサイズを書く
演習用サーバを使っている人はlinuxのコマンドを使って実行時間を計測することができるので、 いくつかのNについて調べてみると良いでしょう。
> time java Lesson3
1~3を解決してもこのプログラムでは、Nがある値を超えるとうまく処理されなくなります。 理由を考えてください。