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

Print Friendly, PDF & Email

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

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


プログラムの説明

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

〔プログラムの説明〕

 整数(int 型)値のスタックを実現するクラスと,そのテストプログラムである。

 プログラム1で定義されるクラス IntStack の使用方法は,次のとおりである。

(1) スタックに1件のデータを格納するには,メソッド push を用いる。 スタックの容量( capacity )は,必要に応じて動的に拡張される。 つまり,データを格納する時点でスタックの容量が不足しているならば, 所定の増分( INCREMENT )だけスタックの容量を拡張する。

(2) スタックから,直前に格納した1件のデータを取り出すには,メソッド pop を用いる。 空のスタックに対して pop を実行すると,例外 EmptyStackExceptionが発生する。

(3) 直前にスタックへ格納したデータを参照するためには,メソッド peek を用いる。

プログラム2は,IntStack のテストプログラムである。 端末に表示したプロンプト => に対して入力された整数値を IntStack 型のオブジェクトに格納し,空の値(改行文字だけ)が入力された時点で, その内容を表示する。

プログラム2の実行例を図に示す。

=> 1 
=> 2 
=> 3 
=> 
3 
2 
1 
--- bottom of Stack ---

図 プログラム2 の実行例

[プログラム1]

import java.util.EmptyStackException;

public class IntStack {
   private static final int INITIAL_CAPACITY = 10;
   private static final int INCREMENT = 5;
   private int capacity = INITIAL_CAPACITY;
   private int[] content;
   private int n_elements = 0;
   public IntStack() { content = new int[capacity]; } 
   public boolean empty() { return n_elements == 0; }
   public void push(int value) {
      if (n_elements == content.length) {
         // 配列を拡張する
         int[] newContent = new int[capacity + INCREMENT];
         for (int i = 0; i < capacity; i++) {
             /*(  a  )*/; 
         }
         capacity += INCREMENT;
         content = newContent;
      }
      /*(  b  )*/ = value;
   } 
   public int peek() throws EmptyStackException {
      if (n_elements > 0) {
         return /*(  c  )*/; 
      }
      throw new EmptyStackException();
   }
   public int pop() throws EmptyStackException {
      int value = peek();
      n_elements--;
      return value;
   }
    public static void main(String[] args) {
        IntStack stack = new IntStack();
        System.out.println(stack);
    }
}

[プログラム2

import java.io.*;

public class TestIntStack {

    public static void main(String[] args) {
        IntStack stack = new IntStack();
        // 標準入力ストリームから読み込むためのReaderオブジェクトを生成する
        BufferedReader in
                = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.print("=> ");
            try {
                String input = in.readLine(); // 標準入力から 1 行分読み込む
                if (input.equals("")) {
                    break;
                }
                int n = Integer.parseInt(input);
                stack.push(n);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        while (/*(  d  )*/) {
            System.out.println(stack.pop());
        }

        System.out.println("--- bottom of Stack ---");
    }
}

 なお,プログラム2 の8行目で使用する InputStreamReader と BufferedReader とは, ともにパッケージ java.io に含まれるクラスである。 クラス InputStreamReader は,入力ストリーム(端末)からのバイト入力を文字に変換する。

クラス BufferedReader は,文字入力ストリームからの入力をバッファリングし, メソッド readLine による行単位での入力処理を可能とする。

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

a に関する解答群

ア newContent[i] = content[i].clone()

イ newContent.set(i, content[i])

ウ newContent[i] = content[i]

エ newContent[i + INCREMENT] = content[i]

b,c に関する解答群

ア content[n_elements]      イ content[n_elements--]

ウ content[n_elements-1]     エ content.elementAt(n_elements)

オ content[n_elements++]    カ content.elementAt(n_elements--)

キ content[n_elements+1]    ク content.elementAt(n_elements++)

d に関する解答群

ア true            イ stack.n_elements >= 0

ウ stack.peek() != null    エ !stack.empty()