<<2..演算子と制御文の目次
除算
問題16(難易度:1)                                2004年12月2日
次の式の値をxに代入したい。下の中から正しい文を選べ。

     (a−b)×(c−d)
     (e−f)×(g−h)

  A: x = (a - b) * (c - d) / ((e - f) * (g - h));
  B: x = (a - b) * (c - d) / (e - f) * (g - h);
  C: x = (a - b) * (c - d) / (e - f) / (g - h);
  D: x = a - b * c - d / e - f * g - h;
解説
 分数は除算で表せます。下に6分の1の変形を載せておきました。いいですよね。これが上のような記号だらけの式になると間違えたりするので気をつけてください。
 +や−の加減算は、*や/の乗除算より演算順序の優先順位が低いので、Dのように元の式の括弧をはずしてはいけません。
 Bは分母にあった(g−h)が最後に全体に掛けてあるので間違えです。上の2分の1掛ける3の間違えと同じです。
 Aは分母の部分を括弧でくくり、先に分母全体を計算してから除算を行っているので正解です。これが一番元の式に近いです。
 Cは上の2分の1割る3の変形と同じなので、やはり正解です。
 分数の復習でした。

解答 A C

参考 読み物Java 第4章 計算しよう、そうしよう
問題17(難易度:2)                                 2004年12月3日
 次をコンパイル、実行すると結果はどうなるか。下から選べ。

          1: int a = 17, b = 2, c;
          2:  double x = 17, y = 2, z;
          3:  c = -a % -6 / b++;
          4:  z = -x % -6 / y++;
          5:  System.out.println("a=" + a + " b=" + b + " c=" + c);
          6: System.out.println("x=" + x + " y=" + y + " z=" + z);
    A: コンパイルエラーになる
      
  B: a=17 b=3 c=2    と出力される      x=17.0 y=3.0 z=2.5   C: a=17 b=3 c=-2    と出力される      x=17.0 y=3.0 z=-2.5   D: a=-17 b=2 c=-2    と出力される      x=-17.0 y=2.0 z=-2.5   E: 実行時に例外が発生する
解説
 まず3行目から。%と/は、演算の優先順位は同じなので、左から順に計算されます。まず「−a%−6」の値を考えましょう。aは17なので、「−17%−6」を求めます。演算子%は、除算の余りを求めます。ややこしいのは、負の数が入ってきたときです。17と6の組み合わせではこんな具合になります。

        17 %   6 →   5
        17 % −6 →   5
       17 %   6 → 
       17 % −6 → 

 わかりましたか。%の左側の数が負の場合のみ、結果が負になるのです。右側の数の符号は関係ありません。この規則を覚えておくといいでしょう。問題は「−17%−6」なので−5になります。

 次はb++で割らなければなりません。++が後ろに付いているので、除算に使われる値は、1UPする前の2になります。−5/2はint型同士の除算なので結果もint型で求められ、つまり小数点以下切り捨てられ−2になります。正解はCかDであることがわかります。bはその値が演算に使われた後1増えますから、3になります。よって正解はC。

 4行目も一応見てみましょう。実行時例外だと困るので。すべてdoubleになったところがちがうだけです。%はdoubleでも使え、左の数から右の数を引けるだけ引き、残った値が結果になります。まあ余りの意味そのものですけど。結果もdoubleで求められます。もちろん小数点以下が付くのが普通です。
 「−x%−6」は、「−17.0%−6」なので、上と同じ−5.0が求まります。これをdoubleの2で割るわけですから、−2.5が答えです。そしてyは3.0になります。よってまちがえなく正解はC。

 ついでに%の右側の数が0の時には、実行時に例外ArithmeticExceptionが発生することをお知らせしておきます。何しろ除算の余りを求めるのですが、右の数が0ということはゼロ割りになってしまうからです。

解答 C

参考 読み物Java 第4章 計算しよう、そうしよう
問題18(難易度:2)                                   2004年12月4日
 次のコードで、正常に実行できるXXXに当てはまるものを下から選べ。

          1:  int a = 12, b = XXX, c;
          2:    c = a / b;

                     
  A: ’a’
  B: a
  C: 0
  D: 12L
  E: ”a”
  F: 3.0
解説
 まずコンパイルエラーになるものを考えましょう。bはint型、代入できるのは拡大変換(→2.演算子と制御文 問題10)できる型でなければなりません。byte、short、charそしてもちろんintはOK。選択肢Aはchar型、Bはint型(の変数)、Cはint型、Dはlong型、EはString型、Fはdouble型なので、D、E、Fはコンパイルエラーになります。
 int型の除算で実行時に例外が発生するのは、割る数が0の場合です。これがCです。このとき発生する例外はArithmeticExceptionです。

解答 A B
参考 読み物Java 第4章 計算しよう、そうしよう
問題19(難易度:2)                                2004年12月5日
次のコードで、正常に実行できるXXXに当てはまるものを下から選べ。

      1:   double a = 12, b = XXX, c;
       2:   c = a / b;   

   A: ’a’   
   B: a   
   C: 0   
   D: 12L   
   E: ”a”   
   F: 3.0
解説
 問題18とちがうのは、int型がdouble型になっているということです。前問同様、コンパイルエラーになるものをまず考えましょう。拡大変換できるものはOKでしたね。bはdouble型なので、Aのchar、Bのint、Cのint、Dのlong、Fのdoubleは問題ありません。いけないのはEです。String型は参照型なので、基本データ型のdoubleの変数には代入できません。
 doubleの除算では、割る数が0でも、例外は発生しません。これが前問と大きな違いです。結果は無限大を表すDouble.POSITIVE_INFINITY(割られる数が正の場合)かDouble.NEGATIVE_INFINITY(割られる数が負の場合)になります。bに0を代入して除算後、次を行うと、「true」が出力されます。

      System.out.println(c == Double.POSITIVE_INFINITY);

 整数の除算での0割りでは例外が発生するが、浮動小数点数(float、double)の除算では例外は発生しない。覚えておきましょう。

解答 A B C D F
参考 読み物Java 第4章 計算しよう、そうしよう
<<2.演算子と制御文の目次次問題>>
Copyright (c) 2004 Nagi Imai All Rights Reserved..