welcome: please sign in
location: "配列"の差分
26と27のリビジョン間の差分
2011-09-26 06:30:02時点のリビジョン26
サイズ: 1605
編集者: masahiko
コメント:
2012-03-22 01:41:33時点のリビジョン27
サイズ: 4073
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 41: 行 41:
----
=== 演習 ===
次の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)
 {{{
上の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がある値を超えるとうまく処理されなくなります。
理由を考えてください。

配列

配列の要素の参照や要素への値の代入などでの要素の指定方法はCと同じです。

  •  a[0] = 1;
     a[1] = a[0] + 2;


配列の大きさ

配列の大きさは length で得ることができる。

配列の宣言と使い始めに必要な処理は異なります。

  •    1  int[] a;
       2  a = new int[100];
       3  for (i = 0; i < a.length; i++)
       4      a[i] = 0;
    

1行目の変数宣言 int[ ] a; により、変数aの場所が用意される。
a の型は int[ ] (すなわち int型の配列)であるが、変数aのために用意されるのは参照型の値が入る箱1つだけである。

  • hairetu1.png

2行目の new int[100] により、int型のデータが100個並んだオブジェクトが作られる。

  • hairetu2.png

それを a に代入することで、aを使って配列の各要素を参照できるようになる。

  • hairetu3.png

3~4行目では配列の要素に0を代入している。
aが参照している配列の大きさは a.length で得ることができ、繰り返しの中で利用している。

変数aの定義と配列オブジェクトの作成が別々になっていることに注意。

配列オブジェクトは実行時に作成されるので、配列の実際の大きさも(コンパイル時でなく)実行時に決まることになる。

3~4行目で用いられている変数iの宣言も必要だが(説明と関係ないので)省略した。


演習

次のCで書かれたプログラムはエラトステネスの篩を用いて1000までの素数を表示するものです。

   1 #include <stdio.h>
   2 
   3 #define N 1000
   4 
   5 int main() {
   6     int i, p, w[N];
   7 
   8     for (i = 0; i < N; i++)
   9         w[i] = 1;
  10     for (p = 2; p < N; p++) {
  11         if ( w[p] ) {
  12             printf("%8d", p);
  13             for ( i = 2*p; i < N; i += p)
  14                 w[i] = 0;
  15         }
  16     }
  17 }

これをもとにして、Javaのプログラムを作成しなさい。

  • ファイル名はLesson3.javaとすること。
  • 慣習に従って、美しいプログラムにすること。
  • Nは定数として記述しなさい。
    • Nを別の値にしたいときは、定数記述の1箇所だけの修正ですむようにすること。
  • wをboolean型配列として宣言し、サイズNで割り当てなさい。
  • wの配列要素に値を代入しているところが2箇所あります。
    • 正しいbooleanの値を代入するように修正しなさい。
  • その他、必要な修正を行って正しく動作するようにしなさい。

(1)

  • 上のCプログラムと同じ動作をするプログラムを作成しなさい。

(2)

  • 求まった素数の個数と、求まった素数のうち最大のもの1つだけを表示するように修正しなさい。

(3)

  • あなたが使っているJava処理系で、どのくらい大きなNまで処理できるか調べなさい。

上級では次の点を調べる必要があります。

  1. コンパイルできること。
  2. 配列をnewで確保できること。
  3. ある程度の時間内に実行できること。
  4. 正しく処理されること。

java コマンドにヒープサイズオプションをつけて実行すると 大きな配列を確保することができます。

  • > java -Xmx500m Lesson3

    • 大文字Xと小文字xに注意
    • 500m の部分に使用するヒープメモリサイズを書く

演習用サーバを使っている人はlinuxのコマンドを使って実行時間を計測することができるので、 いくつかのNについて調べてみると良いでしょう。

  • > time java Lesson3

1~3を解決してもこのプログラムでは、Nがある値を超えるとうまく処理されなくなります。 理由を考えてください。

配列 (最終更新日時 2012-03-22 01:41:33 更新者 masahiko)