<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>配列</title><revhistory><revision><revnumber>27</revnumber><date>2012-03-22 01:41:33</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>26</revnumber><date>2011-09-26 06:30:02</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>25</revnumber><date>2011-09-26 06:14:09</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>24</revnumber><date>2009-10-06 11:51:31</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>23</revnumber><date>2009-10-02 12:19:35</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>22</revnumber><date>2009-10-02 12:18:15</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>21</revnumber><date>2009-10-02 12:17:13</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>20</revnumber><date>2009-10-02 12:16:40</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>19</revnumber><date>2009-10-02 12:14:32</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>18</revnumber><date>2009-10-02 12:14:10</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>17</revnumber><date>2009-09-30 11:30:46</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>16</revnumber><date>2009-09-30 11:29:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>15</revnumber><date>2008-10-14 11:52:38</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>14</revnumber><date>2008-10-14 11:51:44</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>13</revnumber><date>2008-10-14 11:50:34</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2008-10-14 11:49:54</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2008-10-14 11:49:11</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2008-10-07 10:39:26</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2008-10-07 10:38:27</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2008-10-07 10:36:42</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2008-10-07 10:29:45</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2008-10-07 01:13:47</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2008-10-07 01:13:20</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2008-10-07 01:13:00</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2008-10-06 07:44:50</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2008-10-06 07:33:22</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2008-10-06 07:33:00</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>配列</title><para>配列の要素の参照や要素への値の代入などでの要素の指定方法はCと同じです。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ a[0] = 1;
 a[1] = a[0] + 2;]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><section><title>配列の大きさ</title><para>配列の大きさは length で得ることができる。 </para><para>配列の宣言と使い始めに必要な処理は異なります。 </para><para><emphasis role="strong">例</emphasis> </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[ ]]><token><![CDATA[int]]></token><![CDATA[[] ]]><methodname><![CDATA[a]]></methodname><![CDATA[;]]>
<![CDATA[ ]]><methodname><![CDATA[a]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><token><![CDATA[int]]></token><![CDATA[[100];]]>
<![CDATA[ ]]><token><![CDATA[for]]></token><![CDATA[ (]]><methodname><![CDATA[i]]></methodname><![CDATA[ = 0; ]]><methodname><![CDATA[i]]></methodname><![CDATA[ < ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[length]]></methodname><![CDATA[; ]]><methodname><![CDATA[i]]></methodname><![CDATA[++)]]>
<![CDATA[     ]]><methodname><![CDATA[a]]></methodname><![CDATA[[]]><methodname><![CDATA[i]]></methodname><![CDATA[] = 0;]]>
</programlisting></listitem></itemizedlist><para>１行目の変数宣言 int[ ] a; により、変数aの場所が用意される。 </para><para>a の型は int[ ] (すなわち int型の配列)であるが、変数aのために用意されるのは参照型の値が入る箱１つだけである。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E9%85%8D%E5%88%97?action=AttachFile&amp;do=get&amp;target=hairetu1.png"/></imageobject><textobject><phrase>hairetu1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>２行目の new int[100] により、int型のデータが１００個並んだオブジェクトが作られる。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E9%85%8D%E5%88%97?action=AttachFile&amp;do=get&amp;target=hairetu2.png"/></imageobject><textobject><phrase>hairetu2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>それを a に代入することで、aを使って配列の各要素を参照できるようになる。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E9%85%8D%E5%88%97?action=AttachFile&amp;do=get&amp;target=hairetu3.png"/></imageobject><textobject><phrase>hairetu3.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>３～４行目では配列の要素に0を代入している。 </para><para>aが参照している配列の大きさは a.length で得ることができ、繰り返しの中で利用している。 </para><para>変数aの定義と配列オブジェクトの作成が別々になっていることに注意。 </para><para>配列オブジェクトは実行時に作成されるので、配列の実際の大きさも(コンパイル時でなく)実行時に決まることになる。 </para><para>３～４行目で用いられている変数iの宣言も必要だが（説明と関係ないので）省略した。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>演習</title><para>次のＣで書かれたプログラムはエラトステネスの篩を用いて１０００までの素数を表示するものです。 </para><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[#]]><methodname><![CDATA[include]]></methodname><![CDATA[ <]]><methodname><![CDATA[stdio]]></methodname><![CDATA[.]]><methodname><![CDATA[h]]></methodname><![CDATA[>]]>

<![CDATA[#]]><methodname><![CDATA[define]]></methodname><![CDATA[ ]]><methodname><![CDATA[N]]></methodname><![CDATA[ 1000]]>

<token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[() {]]>
<![CDATA[    ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[i]]></methodname><![CDATA[, ]]><methodname><![CDATA[p]]></methodname><![CDATA[, ]]><methodname><![CDATA[w]]></methodname><![CDATA[[]]><methodname><![CDATA[N]]></methodname><![CDATA[];]]>

<![CDATA[    ]]><token><![CDATA[for]]></token><![CDATA[ (]]><methodname><![CDATA[i]]></methodname><![CDATA[ = 0; ]]><methodname><![CDATA[i]]></methodname><![CDATA[ < ]]><methodname><![CDATA[N]]></methodname><![CDATA[; ]]><methodname><![CDATA[i]]></methodname><![CDATA[++)]]>
<![CDATA[        ]]><methodname><![CDATA[w]]></methodname><![CDATA[[]]><methodname><![CDATA[i]]></methodname><![CDATA[] = 1;]]>
<![CDATA[    ]]><token><![CDATA[for]]></token><![CDATA[ (]]><methodname><![CDATA[p]]></methodname><![CDATA[ = 2; ]]><methodname><![CDATA[p]]></methodname><![CDATA[ < ]]><methodname><![CDATA[N]]></methodname><![CDATA[; ]]><methodname><![CDATA[p]]></methodname><![CDATA[++) {]]>
<![CDATA[        ]]><token><![CDATA[if]]></token><![CDATA[ ( ]]><methodname><![CDATA[w]]></methodname><![CDATA[[]]><methodname><![CDATA[p]]></methodname><![CDATA[] ) {]]>
<![CDATA[            ]]><methodname><![CDATA[printf]]></methodname><![CDATA[(]]><phrase><![CDATA["%8d"]]></phrase><![CDATA[, ]]><methodname><![CDATA[p]]></methodname><![CDATA[);]]>
<![CDATA[            ]]><token><![CDATA[for]]></token><![CDATA[ ( ]]><methodname><![CDATA[i]]></methodname><![CDATA[ = 2*]]><methodname><![CDATA[p]]></methodname><![CDATA[; ]]><methodname><![CDATA[i]]></methodname><![CDATA[ < ]]><methodname><![CDATA[N]]></methodname><![CDATA[; ]]><methodname><![CDATA[i]]></methodname><![CDATA[ += ]]><methodname><![CDATA[p]]></methodname><![CDATA[)]]>
<![CDATA[                ]]><methodname><![CDATA[w]]></methodname><![CDATA[[]]><methodname><![CDATA[i]]></methodname><![CDATA[] = 0;]]>
<![CDATA[        }]]>
<![CDATA[    }]]>
<![CDATA[}]]>
</programlisting><para>これをもとにして、Javaのプログラムを作成しなさい。 </para><itemizedlist><listitem><para>ファイル名はLesson3.javaとすること。 </para></listitem><listitem><para>慣習に従って、美しいプログラムにすること。 </para></listitem><listitem><para>Nは定数として記述しなさい。 </para><itemizedlist><listitem override="none"><para>Nを別の値にしたいときは、定数記述の１箇所だけの修正ですむようにすること。 </para></listitem></itemizedlist></listitem><listitem><para>wをboolean型配列として宣言し、サイズNで割り当てなさい。 </para></listitem><listitem><para>wの配列要素に値を代入しているところが２箇所あります。 </para><itemizedlist><listitem override="none"><para>正しいbooleanの値を代入するように修正しなさい。 </para></listitem></itemizedlist></listitem><listitem><para>その他、必要な修正を行って正しく動作するようにしなさい。 </para></listitem></itemizedlist><para>(1) </para><itemizedlist><listitem override="none"><screen><![CDATA[上のCプログラムと同じ動作をするプログラムを作成しなさい。]]></screen></listitem></itemizedlist><para>(2) </para><itemizedlist><listitem override="none"><screen><![CDATA[求まった素数の個数と、求まった素数のうち最大のもの１つだけを表示するように修正しなさい。]]></screen></listitem></itemizedlist><para>(3) </para><itemizedlist><listitem override="none"><screen><![CDATA[あなたが使っているJava処理系で、どのくらい大きなNまで処理できるか調べなさい。]]></screen></listitem></itemizedlist><para>上級では次の点を調べる必要があります。 </para><orderedlist numeration="arabic"><listitem><para>コンパイルできること。 </para></listitem><listitem><para>配列をnewで確保できること。 </para></listitem><listitem><para>ある程度の時間内に実行できること。 </para></listitem><listitem><para>正しく処理されること。 </para></listitem></orderedlist><para>java コマンドにヒープサイズオプションをつけて実行すると 大きな配列を確保することができます。 </para><itemizedlist><listitem override="none"><para>&gt; java -Xmx500m Lesson3 </para><itemizedlist><listitem override="none"><para>大文字Xと小文字xに注意 </para></listitem><listitem override="none"><para>500m の部分に使用するヒープメモリサイズを書く </para></listitem></itemizedlist></listitem></itemizedlist><para>演習用サーバを使っている人はlinuxのコマンドを使って実行時間を計測することができるので、 いくつかのNについて調べてみると良いでしょう。 </para><itemizedlist><listitem override="none"><para>&gt; time java Lesson3 </para></listitem></itemizedlist><para>１～３を解決してもこのプログラムでは、Nがある値を超えるとうまく処理されなくなります。 理由を考えてください。 </para></section></section></article>