基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成17年 春期 基本情報技術者 午後 問12
問12   Java

次の Java プログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

整数値の加減乗除の演算をする電卓プログラムである。 入出力部分はテスト用のプログラムによって用意され,電卓本体部分のプログラムの テストができるようになっている。

(1) クラス CalculatorEvent は電卓のキーが押されたときに発生するイベントである。 イベントにはタイプがありフィールド type の値で表される。 タイプは DIGIT,OPERATOR,CLEAR のいずれかであり,それぞれ電卓の数字キー(0〜9), 演算キー(+ など)及びイコールキー(=),クリアキー(C)を表す。 タイプが DIGIT のときは数字キーに対応する数値を,OPERATOR のときは演算の種類を 表す文字又は '=' をフィールド value に保持する。 タイプが CLEAR のときは,value は使用しない。

(2) インタフェース CalculatorOutput は,電卓上に数値やエラーを 表示するメソッド display を宣言する。

(3) クラス Calculator は電卓本体である。 メソッド eventDispatched はイベントを受け取り,イベントのタイプに応じて演算処理などを行う。

なお,二つの数値に対する加減乗除の演算結果は Java の int 型の演算結果に一致するものとする。

(4) クラス CalculatorTest は Calculator をテストするプログラムである。
CalculatorOutput を匿名クラスとして実装する。この実装では,メソッド display は指定された数値又は文字列を System.out に出力する。メソッド main は,引数 args[0] で与えられた文字列から CalculatorEvent を生成して, Calculator のメソッド eventDispatched を呼び出す。 文字と電卓のキーの対応は,次の表のとおりである。

文字電卓キー
 '0' 〜 '9' 数字キー(0 〜 9)
 '+' 加算キー(+)
 '-' 減算キー(−)
 '*' 乗算キー(×)
 '/' 除算キー(÷)
 '=' イコールキー(=)
 'C' クリアキー(C)

例えば,文字列“2+7=”は,電卓キー 2,+,7,= が順に押されたことを表し, この文字列が引数 args[0] としてメソッド main に渡されたとき,プログラムは次のとおり出力する。

  2    
  2   
  7   
  9   

〔プログラム 1〕

public class CalculatorEvent {
   public static final int DIGIT = 1;
   public static final int OPERATOR = 2;
   public static final int CLEAR = 3;
   private int type, value;
   public CalculatorEvent(int type) {
      ;
   }
   public CalculatorEvent(int type, int value) {
      if (type < DIGIT || type > CLEAR)
         throw new IllegalArgumentException();
      this.type = type; this.value = value;
   }
   public int getType() { return type; }
   public int getValue() { return value; }
}

〔プログラム 2〕

public interface CalculatorOutput {
   public void display(int value);
   public void display(String value);
}

〔プログラム 3〕

public class Calculator {
   private int accumulator = 0, register = 0;
   private int operator = 0;
   private CalculatorOutput output;
   public Calculator(CalculatorOutput output) {
      this.output = output;
   }
   public void eventDispatched(CalculatorEvent event) {
      switch (event.getType()) {
      case CalculatorEvent.DIGIT:
         if (operator == '=') {
            register = 0; operator = 0;
         }
         register = register * 10 + event.getValue();
         output.display(register);
         break;
      case CalculatorEvent.OPERATOR:
         try {
            register = calculate();
            output.display(register);
            accumulator = register;
            operator = event.getValue();
         } catch (ArithmeticException e) {
            output.display("Error");
            accumulator = 0; operator = 0;
         }
         if (operator != '=')
            register = 0;
         break;
      case CalculatorEvent.CLEAR:
         register = 0;
         accumulator = 0;
         operator = 0;
         output.display(register);
         break;
      }
   }
 
   private int calculate() {
      switch (operator) {
      case '+':
         return accumulator + register;
      case '-':
         return accumulator - register;
      case '*':
         return accumulator * register;
      case '/':
         return accumulator / register;
      }
      return register;
   }
}

〔プログラム 4〕

public class CalculatorTest {
   public static void main(String[] args) {
      Calculator calc = new Calculator(
          {
            public void display(int value) {
               System.out.println(value);
            }
            public void display(String value) {
               System.out.println(value);
            }
         });
      String keys = args[0];
      for (int i = 0; i < keys.length(); i++) {
         char c = keys.charAt(i);
         CalculatorEvent event = null;
         if (c >= '0' && c <= '9') {
            event = new CalculatorEvent(
                                );
         } else if (c == '=' || c == '+' || c == '-'
                    || c == '*' || c == '/') {
            event = new CalculatorEvent(
                                CalculatorEvent.OPERATOR, c);
         } else if (c == 'C') {
            event = new CalculatorEvent(
                                CalculatorEvent.CLEAR);
         }
         if (event != null)
            calc.eventDispatched(event);
      }
   }
}

設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア CalculatorEvent(type, 0)

イ new CalculatorEvent(type, 0)

ウ return new CalculatorEvent(type, 0)

エ super(type, 0)

オ this(type, 0)

b に関する解答群

ア implements CalculatorOutput()

イ interface CalculatorOutput()

ウ new CalculatorOutput()

エ new Temp() implements CalculatorOutput

オ public class Temp implements CalculatorOutput

c に関する解答群

ア c - '0', CalculatorEvent.DIGIT

イ c, CalculatorEvent.DIGIT

ウ CalculatorEvent.DIGIT

エ CalculatorEvent.DIGIT, c

オ CalculatorEvent.DIGIT, c - '0'

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます


設問2 次の表は文字列を引数としてメソッド main を実行したときに, 最後に出力された結果を表している。 表中の に入れる正しい答えを,解答群の中から選べ。 ただし,プログラム中の には すべて正しい答えが入っているものとする。

文字列出力
 3+4*5=  35
 3*4***=
 3*4=+5
 3+4/0=

解答群

ア 0    イ 3    ウ 4    エ 5

オ 7    カ 12    キ 17    ク 53

ケ / by zero    コ Error

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます

解答 f ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]