「Java/基礎/反復処理」の版間の差分

削除された内容 追加された内容
M +syntax,tt->{{tt}}
10 行
Hello world同様、実用的な意味は全くありませんが、反復処理を使っています。
 
<syntaxhighlight lang="java" highlight="4,6">
class JapaneseHelloWorld {
class JapaneseHelloWorld {
public static void main(String[] args) {
public static void main(String[] args) {
char[] msg = "世界よこんにちは".toCharArray();
char[] msg = "世界よこんにちは".toCharArray();
<b>for (int i = 0; i < msg.length; i++) {</b>
for (int i = 0; i < System.out.println(msg[.length; i]++); {
<b>}</b> System.out.println(msg[i]);
}
}
}
}
 
</syntaxhighlight>
{{Wikipedia|for文|for文}}
上の例は'''for文'''と呼ばれる構文を使った例です(4行目にキーワード「<{{tt>|for</tt>}}」があることに注意してください)。
コンパイルして実行してみましょう。
 
35 ⟶ 36行目:
 
 
一応“縦書き”でメッセージが表示されます(コマンドの行頭に出てくる「<{{tt>|$</tt>}}」の文字は、プロンプトを表しています)。同様の表示結果になれば成功です。
 
 
66 ⟶ 67行目:
このプログラムは次のように書くこともできます。
 
<syntaxhighlight lang="java" highlight="5,8">
class JapaneseHelloWorld {
class JapaneseHelloWorld {
public static void main(String[] args) {
public static void main(String[] args) {
char[] msg = "世界よこんにちは".toCharArray();
char[] int imsg = 0"世界よこんにちは".toCharArray();
int <b>while (i < msg.length)= {</b>0;
while (i < Systemmsg.out.println(msg[i]length); {
System.out.println(msg[i++]);
<b>}</b> i++;
}
}
}
}
</syntaxhighlight>
 
{{Wikipedia|while文|while文}}
こちらは'''while文'''を使った書き方です。
さらに次のような書き方もできます。
<syntaxhighlight lang="java" highlight="5,7">
 
class JapaneseHelloWorld {
public static void main(String[] args) {
char[] msg = "世界よこんにちは".toCharArray();
int i = 0;
<b>do {</b>
System.out.println(msg[i]);
<b>} while (++i < msg.length);</b>
}
}
</syntaxhighlight>
 
これは'''do-while文'''と呼ばれます。
 
96 ⟶ 99行目:
またさらには、Java SE 5.0 以降を使っている場合、'''拡張for文'''と呼ばれるものをつかって次のような書き方も可能です。
これが最もシンプルな書き方です。
<syntaxhighlight lang="java">
class JapaneseHelloWorld {
class JapaneseHelloWorld {
public static void main(String[] args) {
public static void main(String[] args) {
for (char c: "世界よこんにちは".toCharArray()) {
for (char c: System"世界よこんにちは".out.printlntoCharArray(c);) {
} System.out.println(c);
}
}
}
}
 
</syntaxhighlight>
反復処理を紹介する導入として、カタログ的にいくつかの書き方を紹介しました(もっとも、この例のように配列要素を取り出したい場合は、通常for文が適していると言えるでしょうけれども)。
 
122 ⟶ 126行目:
!説明
|-
! <{{tt>| &gt; </tt>}}
| 数学の &gt; と同様。左辺の値が右辺の値よりも大きい場合に真
|-
! <{{tt>| &gt;= </tt>}}
| 数学の ≧ と同様。左辺の値が右辺の値よりも大きいか、もしくは等しい場合に真
|-
! <{{tt>| &lt; </tt>}}
| 数学の &lt; と同様。<{{tt>|&gt;</tt>}}の逆。左辺の値が右辺の値より小さい場合に真
|-
! <{{tt>|&lt;=</tt>}}
| 数学の ≦ と同様。左辺の値が右辺の値よりも小さいか、もしくは等しい場合に真
|-
! <{{tt>|==</tt>}}
| 左辺の値と右辺の値が等しい場合に真
|-
! <{{tt>|!=</tt>}}
| <{{tt>|==</tt>}}の逆。左辺の値と右辺の値が等しくない場合に真
|-
|}
163 ⟶ 167行目:
#*# 反復処理を終了する
 
なお、<i>繰り返す処理</i>は、単文であればブロック(<{{tt>|{ }</tt>}})を外すこともできます。
たとえば次のように書きます。
 
<syntaxhighlight lang="java">
for (int i = 0; i < msg.length; i++) System.out.println(msg[i]);
for (int i = 0; i < msg.length; i++) System.out.println(msg[i]);
 
</syntaxhighlight>
 
=== for文を読み解く ===
しばしばfor文では、'''ループカウンタ'''と呼ばれる変数が使われます。このページの冒頭で掲げた例では変数<{{tt>|i</tt>}}がそれに当たります。
 
この例では「継続処理」が「<{{tt>|i++</tt>}}」となっています。これは、<{{tt>|i</tt>}}の値を1増やす処理ですね。
for文が適用されるシーンはさまざまありますが、その最も典型的な適用パターンの1つは、このように1回繰り返すごとにループカウンタの値を変化させ、それにより繰り返される処理のパラメータを変化させるというものです。
 
178 ⟶ 183行目:
 
たとえば、次のコード片は、7の段の九九を表示する処理です。
<syntaxhighlight lang="java">
for (int n = 1; n <= 9; n++) {
for (int n = 1; n <= 9; n++) {
  System.out.println("7 x " + n + " = " + 7 * n); // <b>A</b>
}
</syntaxhighlight>
 
 
この反復される処理は、繰り返すたびにどのように変化するでしょうか。一緒に想像力を働かせながら、頭の中でプログラムの動作をトレースしてみることにしましょう。
 
まず、<{{tt>|n</tt>}}の値は最初「1」です(これは反復条件「n <= 9」を満たしています)。ですから、<b>A</b>で示した文は
<syntaxhighlight lang="java">
System.out.println("7 x 1 = " + 7 * 1);
System.out.println("7 x 1 = " + 7 * 1);
</syntaxhighlight>
と同等になります。
2回目はどうでしょう? 2回目では<{{tt>|n++</tt>}}され、<{{tt>|n</tt>}}の値は2になります。
ですから、<b>A</b>の文は
<syntaxhighlight lang="java">
System.out.println("7 x 2 = " + 7 * 2);
System.out.println("7 x 2 = " + 7 * 2);
</syntaxhighlight>
と同等ということになります。簡単ですね?
 
以下、反復条件を満たさなくなるまで同様のことが繰り返されるわけですが、ではどのように終了するか、終了の際の動作を思い描くことができますか。
一緒に<{{tt>|n</tt>}}が8の状態からトレースしてみましょう。
 
# <{{tt>|n</tt>}}が8の状態で<b>A</b>の文が実行される
# <{{tt>|n++</tt>}}される。<{{tt>|n</tt>}}は9になる
# <{{tt>|n <= 9</tt>}}のチェックが行われる。<{{tt>|n</tt>}}は9だから結果は真
# <{{tt>|n</tt>}}が9の状態で<b>A</b>の文が実行される
# <{{tt>|n++</tt>}}される。<{{tt>|n</tt>}}は10になる
# <{{tt>|n <= 9</tt>}}のチェックが行われる。<{{tt>|n</tt>}}は10だから結果は偽
# 繰り返しが終了する
 
213 ⟶ 223行目:
for文の学習と言えば、典型的な例が掛け算九九を表示するサンプルです。
 
<syntaxhighlight lang="java">
class Main {
class Main {
public static void main(String[] args) {
public static void for main(int y = 1; y <= 9;String[] y++args) {
for (int xy = 1; xy <= 9; xy++) {
for (int x = 1; x <= 9; x++) {
String buf = String.format("%dx%d=%2d ", x, y, x * y);
System.out.print(buf);
}
System.out.println();
}
}
}
</syntaxhighlight>
 
もしかすると初めのうちは、for文が入れ子になると分かりづらいかもしれません。
処理の流れを追うことができますか?
236 ⟶ 247行目:
冒頭で掲げた例のうち
 
<syntaxhighlight lang="java">
class JapaneseHelloWorld {
class JapaneseHelloWorld {
public static void main(String[] args) {
public static void main(String[] args) {
for (char c : "世界よ今日は".toCharArray()) {
for (char c : System"世界よ今日は".out.printlntoCharArray(c);) {
} System.out.println(c);
}
}
}
}
 
</syntaxhighlight>
 
が拡張for文を使った例です。
275 ⟶ 287行目:
while文の書式は次のとおりです。
 
<syntaxhighlight lang="java">
while (<i>反復条件</i>) {
while (/* 反復条件 */) {
<i>繰り返す処理</i>
/* 繰り返す処理 */
}
}
 
</syntaxhighlight>
処理の進み方は次のとおりです。
 
296 ⟶ 309行目:
たとえば、次の例は、引数で指定されたテキストファイルを読み込んで表示するサンプルです。
 
<syntaxhighlight lang="java" highlight="8,10">
import java.io.*;
import java.io.*;
class CatLike {
public static void main(String[] args) throws IOException {
for (String fn: args) {
BufferedReader in = new BufferedReader(new FileReader(fn));
String line = null;
<b>while ((line = in.readLine()) != null) {</b>
System.out.println(line);
<b>}</b>
}
}
}
 
class CatLike {
public static void main(String[] args) throws IOException {
for (String fn : args) {
BufferedReader in = new BufferedReader(new FileReader(fn));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
}
}
</syntaxhighlight>
このようにファイルやデータベースからデータを読み込むような処理は、while文が使われることの多い例と言えるかもしれません。