<<2.演算子と制御文の目次
for文
問題6(難易度:3)                               2004年11月8日
次の出力を得るためには、プログラム中のどこに、行を終わらせる
    System.out.println();
を挿入すればよいか、選びなさい。

[出力結果]
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 
5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 
6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 
7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 
8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 
9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 
[プログラム]
        1:    int i, j;
        2:    for(i = 2; i <= 9; i++) {
        3:            for(j = 2; j <= 9; j++) {
        4:                    System.out.print(i + "*" + j + "=" + i * j + " ");
        5:            }                       
        6:    }
                


  A.1行目と2行目の間
  B.2行目と3行目の間
  C.3行目と4行目の間
  D.4行目と5行目の間
  E.5行目と6行目の間
  F.6行目の後
  
解説 
 for文の繰り返しが二重になっています。いっぺんに考えると訳がわからなくなるので、外側と内側のループ(繰り返し)で分けて考えてみます。

 まず外側のループでは変数iの値が、2から3,4,5,...と9まで増えていきます。ということは、言い換えると、下の図で赤く囲んだ内側の処理を、iの値を2から9まで変化させながら繰り返せばよいことになります。たまたまここがまたループである、というわけです。
 では外側のループ1回目、つまりiが2のときの、赤い枠内の処理を考えて見ましょう。下の青く囲んであるように、iはもう2に固定してしまいます。



 では青い部分で何が出力されるでしょうか。jの値は2から9まで増えるので、最初はi、jともに2の
    2*2=4
が出力されます。次はjが3になって、(iは2で固定ですよ)
    2*3=6
が出力されます。あとはもういいですか?そうです九九の二の段が、横に並んで出力されます。改行されないのは、printlnではなくprintを使っているからです。

      2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18

 さあ内側のループ、青い部分が終わったので、次は、外側のループ2回目になります。iの値が1増えて3になり、以下同じことを繰り返します。今度は三の段が出力されます。

 おっとこのままでは二の段と三の段がズラズラ同じ行に出てきてしまいます。二の段の出力が終わったところで、改行すればよいですね。つまり青く囲んだ部分の直後に、改行のための文を挿入すればいいことになります。よって正解はE。

 さあ、ここまでできれば上出来なのですが、実は落とし穴が...青い内側のループの直後に改行する、という方法以外に、直前に改行する、でもいいことに気付いたでしょうか。確かに最初に余分に改行するかしないかの違いはあるのですが、同じ結果が出ます。よってBも正解。これはかなり難しい問題になってしまいました。

 (ちなみに複数選択の場合、2個選べ、3個選べ、と個数が指定してありましたが、現在はどうか、また問題も受験者によってちがうようなので、保証できません。)


解答 B、E

参考 読み物Java 第6章 ぐるぐる回る(注:この中には2重の繰り返しの解説はありません)
<<2.演算子と制御文の目次次問題>>
Copyright (c) 2004-2005 Nagi Imai All Rights Reserved..