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

Print Friendly, PDF & Email

ここでは、当社の新人研修受講者に向けて、基本情報のJavaの過去問を掲載しています。

想定しているのは、NetBeansなどのIDEにコピー・ペーストしたうえで、自分の正しいと思う答えを埋めて動作を確認するという使い方です。



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

〔プログラムの説明〕

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

(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 を呼び出す。 文字と電卓のキーの対応は,次の表のとおりである。

図

例えば,文字列“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) {
        /* a */;
    }

    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(
                /* b */ {
            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(/* c */);
            } 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'

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

図

解答群

ア 0    イ 3    ウ 4    エ 5

オ 7    カ 12   キ 17    ク 53

ケ / by zero      コ Error