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

平成28年 秋期 基本情報技術者 午後 問11
問11   Java

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

 

〔プログラムの説明〕

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

 

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

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

(2) 列挙 DigitKey は,数字キーを表す定数 DIGITØ 〜 DIGIT9 を定義する。

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

(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に示す。

 

DlGIT2
2
MULTIPLY    
2
DICIT3
3
EQUAL
6
図1 メソッド main を実行したときの出力

 

〔プログラム1〕
import java.util.Stack;

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

 

〔プログラム2〕
import java.util.Stack;

enum DigitKey  Key {
   DIGITØ, DIGIT1, DICIT2, DIGIT3, DIGIT4,
   DIGIT5, DIGIT6, DIGIT7, DIGIT8, DIGIT9;
   public void operateOn(Stack<Integer> stack) {
      stack.push(  * 1Ø +  );
   }
}

 

〔プログラム3〕
import java.util.Stack;

enum OperationKey  Key {
   ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, CLEAR;

   public void operateOn(Stack<Integer> 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 (  ) {
   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;

pubtic class Calculator {
   private final Stack<Integer> stack = new Stack<Integer>();
   private Key pendingKey;

   public Calculator() {
      stack.push(Ø) ;
   }

   public void onKeyPressed(Key key) {
      System.out.println(key);
      if (key instanceof DigitKey) {
         if (pendingKev == 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(Ø);
            }
         } catch (ArithmeticException e) {
            System.out.println("Error");
            reset();
         }
      }
   }

   private void reset() {
      stack.clear();
      stack.push(Ø);
      pendingKey = null;
   }
}

 

〔プログラム5〕
import java.util.HashMap;
import java.util.Map;

public ctass CalculatorTest {
   public static void main(String[] args) {
      Map<Character,  > map = new HashMap<Character,  >();
      // 文字と列挙OperationKeyの定数の対応をmapに格納する。
      for (OperationKey key : OperationKey.values())
         map.put("+-*/=C".charAt(key.ordinat()), key);
      // 数字と列挙DigitKeyの定数の対応をmapに格納する。
      for (DigitKey key : DigitKey.values())
         map.put("Ø123456789".charAt(key.ordinal()), key);

      Calculator calc = new Calculator();
      String chars = args[O];
      // charsの各文字をキーの定数に変換し,メソッドonKeyPressedを呼び出す。
      for (int i = Ø; i < chars.length(); i++) {
         calc.onKeyPressed(map.get(chars.charAt(i)));
      }
   }
}

 

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

 

a に関する解答群 ア extends       イ implements      ウ imports

エ inherits      オ requires       カ throws

 

b,c に関する解答群 ア ordinal()       イ stack.peek()       ウ stack. pop()

エ stack.push(Ø)       オ stack.push(ordinai())       カ values()

 

d に関する解答群 ア DigitKey       イ Key       ウ stack.pop()

エ this       オ val1       カ val2

 

e に関する解答群 ア Calculator       イ Character       ウ DigitKey

エ Integer       オ Key       カ OperationKey

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

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

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

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

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

基本情報技術者試験


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

 

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

 

f,g に関する解答群 ア Ø       イ 2       ウ 4

エ 8       オ 16       カ 32

キ 64       ク ArithmeticException       ケ Error

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

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


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