総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成28年度秋 基本情報技術者試験午後 過去問11設問2 ソフトウェア開発(Java) 合格率アップ!動画付き解説!

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

〔プログラムの説明〕

整数値の加減乗除の演算をする電卓のプログラムである。この電卓は、数字キー、加減乗除の各演算キー、イコールキー及びクリアキーをもつ。プログラムは、キーが押されたとき、それぞれのキーに対応する処理を実行する。数値などの表示は、System.out.printlnを呼び出して行う。

(1) インタフェースKeyは、電卓のキーが押されたときの処理を実行するメソッドを定義する。

メソッドoperateOnは、引数で与えられたクラスjava.util.Stackのインスタンス(以下、スタックという)に対して、キーに対応する処理を実行する。

(2) 列挙DigitKeyは、数字キーを表す定数DIGIT0~DIGIT9を定義する。

メソッドoperateOnは、キーを10進数の入力として処理する。引数で与えられたスタックの先頭に格納されている値は0(初期値)又は入力中の数値であり、その値を更新する。

(3) 列挙OperationKeyは、加減乗除の各演算キー、イコールキー及びクリアキーを表す定数ADD、SUBTRACT、MULTIPLY、DIVIDE、EQUAL及びCLEARを定義する。

メソッドoperateOnは、加減乗除の各演算キーに対応する演算を、スタックの内容に対して実行する。

(4) クラスCalculatorは、電卓本体を表す。フィールドstackは、電卓内部の数値の状態を表すスタックを保持する。フィールドpendingKeyは、演算に必要な数値の入力が終わるまで演算キーを保持する。また、イコールキーが押されたときは、イコールキーを保持する。例えば、キーの定数DIGIT2、ADD、DIGIT4が順に処理されたとき、スタックに格納されている値は先頭から4、2であり、pendingKeyの値はADDである。次にキーの定数EQUALが処理されたとき、演算キーADDの加算処理が実行され、スタックに格納されている値は6となり、pendingKeyの値はEQUALとなる。ここで、二つの数値に対する加減乗除の演算結果は、Javaのint型の演算結果に一致するものとする。

メソッドonKeyPressedは、電卓のキーが押されたときに呼び出される。押されたキーは、引数で与えられる。押されたキ一及び電卓の内部状態に基づいて、処理を実行する。

(5) クラスCalculatorTestは、クラスCalculatorをテストするプログラムである。

メソッドmainは、まず、文字と電卓の各キーとの対応を作成し、クラスCalculatorのインスタンスを生成する。次に、引数で与えられた文字列の各文字をキーの定数に変換し、そのキーの定数を引数としてクラスCalculatorのインスタンスのメソッドonKeyPressedを呼び出す。例えば、メソッドmainの引数として文字列"2*3="が与えられたとき、それぞれの文字を、キーの定数DIGIT2、MULTIPLY、DIGIT3、EQUALに変換し、逐次それぞれのキーの定数を引数としてメソッドonKeyPressedを呼び出す。メソッドmainを実行したときの出力を図1に示す。

DIGIT2

2

MULTIPLY

2

DIGIT3

3

EQUAL

6

図1 メソッドmainを実行したときの出力

[プログラム1]

import java.util.Stack;

public interface Key {
    public void operateOn(Stack stack);
}

[プログラム2]

import java.util.Stack;

enum DigitKey a Key {
    DIGIT0, DIGIT1, DIGIT2, DIGIT3, DIGIT4, 
    DIGIT5, DIGIT6, DIGIT7, DIGIT8, DIGIT9;
    
    public void operateOn(Stack stack) {
        stack.push(b * 10 + c);
    }
}

[プログラム3]

import java.util.Stack;

enum OperationKey a Key {
    ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, CLEAR;
    
    public void operateOn(Stack stack) {
        if(this == EQUAL || this == CLEAR) {
            return;
        }
        int val2 = stack.pop();
        int val1 = stack.pop();
        stack.push(calculate(val1, val2));
    }
    
    private int calculate(int val1, int val2) {
        switch(d) {
            case ADD:
                return val1 + val2;
            case SUBTRACT:
                return val1 - val2;
            case MULTIPLY:
                return val1 * val2;
            case DIVIDE:
                return val1 / val2;
            default:
                throw new AssertionError(toString());
        }
    }
}

[プログラム4]

import java.util.Stack;

public class Calculator {
    private final Stack stack = new Stack();
    
    private Key pendingKey;
    
    public Calculator() {
        stack.push(0);
    }
    
    public void onKeyPressed(Key key) {
        System.out.printLn(key);
        if (key instanceof DigitKey) {
            if (pendingKey == OperationKey.EQUAL) {
                reset();
            }
            key.operateOn(stack);
            System.out.println(stack.peek());
        } else if (key == OperationKey.CLEAR) {
            reset();
            System.out.println(stack.peek());
        } else {
            try {
                if (pendingKey != null) {
                    pendingKey.operateOn(stack)
                }
                System.out.println(stack.peek());
                pendingKey = key;
                if (key != OperationKey.EQUAL) {
                    stack.push(0);
                }
            } catch (ArithmeticException e) {
                System.out.println("Error");
                reset();
            }
        }
    }
    
    private void reset() {
        stack.clear();
        stack.push(0);
        pendingKey = null;
    }
}

[プログラム5]

import java.util.HashMap;
import java.util.Map;

public class CalculatorTest {
    public static void main(String[] args) {
        Map<Character, e> map = new HashMap<Character, e>();
        // 文字と列挙OperationKeyの定数の対応をmapに格納する。
        for (OperationKey key : OperationKey.values())
            map.put("+-*/=C".charAt(key.ordinal()), key);
        for (DigitKey key : DigitKey.values())
            map.put("0123456789".charAt(key.ordinal()), key);
        
        Calculator calc = new Calculator();
        String chars = args[0];
        // charsの各文字をキーの定数に変換し、メソッドonKeyPressedを呼び出す。
        for (int i = 0; i < chars.length(); i++) {
            calc.onKeyPressed(map.get(chars.charAt(i)));
        }
    }
}

設問2 表1は、文字列を引数としてメソッドmainを実行したときの出力の最後の行(図1の場合は6)を表している。表中の に入れる正しい答えを、解答群の中から選べ。ここで、プログラム中の には、全て正しい答えが入っているものとする。

表1 文字列(引数)と出力(最後の行)

文字列(引数) 出力(最後の行)
2*6/3= 4
-2= -2
2*4== 8
2*4C2= f
8/2/= g

f、gに関する解答群

  • ア:0
  • イ:2
  • ウ:4
  • エ:8
  • オ:16
  • カ:32
  • キ:64
  • ク:ArithmeticException
  • ケ:Error

解説 設問2

fの正解は「イ:2」です!

fは表1 文字列(引数)と出力(最後の行)の文字列が「2*4C2=」の結果です。

「2*4C2=」は

DIGIT2

MULTIPLY

DIGIT4

CLEAR

DIGIT2

EQUAL

と変換され、計算します。出力結果は下記の通りです。

DIGIT2

2

MULTIPLY

2

DIGIT4

4

CLEAR /* 今までの計算が初期化される */

0

DIGIT2

2

EQUAL

2

結果的に2を押してから、イコールを押した結果と同じになります。

従って、fの正解は「イ:2」です!

gの正解は「ケ:Error」です!

gは表1 文字列(引数)と出力(最後の行)の文字列が「8/2/=」の結果です。

「8/2/=」は

DIGIT8

DEVIDE

DIGIT2

DEVIDE

EQUAL

と変換され、計算します。出力結果は下記の通りです。

DIGIT8

8

DEVIDE

8

DIGIT2

4

DEVIDE

4

EQUAL /* DEVIDE(/ 除算)の際に0で除算しようとして例外(ArithmeticException)となる */

Error

結果的にArithmeticExceptionが発生します。この時標準出力には「Error」と出力します。

従って、gの正解は「ケ:Error」です!

平成28年度秋 基本情報技術者試験過去問午後 目次

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説