JAVA入門

JAVA入門後期⑩
情報処理試験例題解説
平成13年秋・14年春・解説
平成13年度秋午後
次の Java プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
プログラムは,ある衣料品小売業 A 社の在庫管理システムで使用するクラ
スとそのテスト用クラスからなる。現在 A 社で取り扱う商品はスラックス
(Slacks)とジーンズ(Jeans)であり,両方に共通な属性である品番(code),
サイズ(size)及び色(color)は抽象クラス Pants で定義する。サイズ及び色
については,それぞれの属性値が引数の値と等しいかどうかを判定するメ
ソッドとして sizeIs 及び colorIs を定義する。
ジーンズ(Jeans)は,打ち合いがボタン留めであるかファスナー留めである
かを示す属性(buttonFront)をもつ。
実行結果
テスト用クラスのメソッド main を実行すると,次の実行結果を
得る。
S1, 31, Black
S2, 31, Black
J1, 32, Black, zipper
J2, 34, Blue, button
true
true
false
false
〔プログラム〕
public class TestPants { // テスト用クラス
public static void main(String[] args) {
Pants[] pants = {
new Slacks("S1", 31, "Black"),
new Slacks("S2", 31, "Black"),
new Jeans("J1", 32, "Black", false),
new Jeans("J2", 34, "Blue", true),
};
String black = new String("Black");
for (int i = 0; i < pants.length; i++) {
System.out.println(pants[i]);
}
System.out.println(pants[0].sizeIs(31));
System.out.println(pants[1].colorIs(black));
System.out.println(pants[2].sizeIs(30));
System.out.println(pants[3].colorIs(black));
}
}
abstract class Pants {
String code;
int size;
String color;
Pants(String code, int size, String color) {
this.code = code;
this.size = size;
this.color = color;
}
public boolean sizeIs(int size) {
return
;
a
}
public boolean colorIs(String color) {
return
;
b
}
public String toString() {
return code + ", " + size + ", " + color;
}
}
class Slacks extends Pants {
Slacks(String code, int size, String color) {
super(code, size, color);
}
}
class Jeans extends Pants {
boolean buttonFront;
Jeans(String code, int size, String color, boolean buttonFront) {
c ;
this.buttonFront = buttonFront;
}
public String toString() {
return
;
d
}
}
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a,b に関する解答群
ア this.size = size
イ this.size == size
ウ this.size.equals(size)
エ this.color = color
オ this.color == color
カ this.color.equals(color)
c に関する解答群
ア super()
イ super(buttonFront)
ウ super(code, size, color)
エ super(code, size, color, buttonFront)
d に関する解答群
ア code + ", " + size + ", " + color
イ code + ", " + size + ", " + color + ", " + buttonFront
ウ super.toString() + ", " + buttonFront
エ super.toString() + ", " + (buttonFront ? "button" : "zipper")
解説
aについて
サイズ及び色については,それぞれの属性値が引数の値と等
しいかどうかを判定するメソッドとして sizeIs 及び colorIs を定
義する。
という問題文より、
public boolean sizeIs(int size);
public boolean colorIs(String color);
は、そのインスタンスの属性値が引数の値と等しいかどうか
を判定するメソッドである。
インスタンスの属性(フィールド)sizeと
引数sizeを比較した結果が同じであればtrue、異なればfalse
となるように
sizeIsメソッドを作成する必要がある。
解答の候補の内、sizeが出てくるのは
ア this.size = size
イ this.size == size
ウ this.size.equals(size)
引数sizeとフィールドsizeの比較を行う際に変数名が同じsizeで
あるため、メソッド内でフィールドsizeを使用するにはthis.sizeと
する必要がある。
bについて
aと同じ考え方で、異なるのは比較対象の型がString型という点
エ this.color = color
オ this.color == color
カ this.color.equals(color)
a について
?は代入処理であり、returnで返すべきboolean型にならないの
で間違い。
??はthis.sizeがint型(プリミティブ型)であるため、equalsメソッド
を呼び出すことはできないので間違い。
???は==の演算で結果がboolean型になる。
b について
?は代入処理であり、returnで返すべきboolean型にならないの
で間違い。
??はオブジェクトの比較であり、Stringの値の比較にならないた
め間違い。
???はString.equalsメソッドによってStringの値の比較を行い、比
較結果をboolean型で返す。
c について
Jeansコンストラクタの中で、cの下では
this.buttonFront = buttonFront;
と属性buttonFrontの設定をしているのみであるため、
コンストラクタの他の引数(String code, int size, String color,
の設定を行う必要がある。
Jeansクラスと同じく、Pantsクラスを継承したSlacksクラスのコン
ストラクタを見ると、
super(code, size, color);
によってcode,size,colorのコンストラクタの引数を属性に設定
したがって
Jeansコンストラクタでも
?
が正解である。
他の選択肢である
??
???
????
については、親クラス(スーパークラス)に、
引数の一致するコンストラクタが定義されておらず間違い。
dについて:
JeansクラスのtoString()メソッドで返す値を設定する処理である。
TestPantsのメインメソッドの処理と出力結果より、
JeansクラスのtoString()メソッドの結果として
(Jeansクラス(pants配列の3,4番目のメンバ))
new Jeans(“J1”, 32, “Black”, false),
new Jeans(“J2”, 34, “Blue”, true),
(上に対応するJeans.toString()メソッドの結果)
J1, 32, Black, zipper
J2, 34, Blue, button
code,size,colorを繋ぎ合わせた文字列の他、
boolean buttonFrontが
falseの時:zipper
trueの時 :button
をつなぎ合わせる必要がある。
選択肢の中から
?
が出力結果と一致する結果となる。
??
->Jeansの4番目の引数buttonFrontに関する文字列が、付
加されないため間違い。
???
->Jeansの4番目の引数buttonFrontに関する文字列が、
true、falseで付加されるため間違い。
????
->同上。
平成14年度春午後
次の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 ---
〔プログラム 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;
}
}
〔プログラム 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()
(問題概要)
データ構造「スタック」に関する問題。 (前提知識)
●スタックの基本的知識
●java.ioの入力ストリームに関する知識
(解説)
(1)スタックとは
まず、「スタック」とは、「後からに格納したデータを最初に取り出す」とい
う「後入れ先出し(LIFO)」のデータ構造です。操作としては、PUSHとPOP
があります。
●PUSH スタックにデータを格納する。
●POP スタックからデータを取り出す。
(2)プログラムの流れ
プログラムの流れとしては、クラスIntStackでスタックでスタックを実現するた
めの3つのメソッドを定義しています。実行は、クラスTestIntStackより行って
います。ここの流れとしては、IntStackクラスのオブジェクトを作成して、標準
入力より、1行分読み込み、その内容を整数型へ変換
(Integer.parseInt(input))しています。この処理をループしています。次に、そ
の内容をpopメソッドを利用して出力しています。
(a)
このプログラムでは、スタックを配列の「content」で実現しています。
ここでは、配列の拡張処理の部分です。contensの要素数とn_elementsが
等しい時に拡張する必要があります。
ここで、定数「INCREMENT(5)」分、増加して配列「newContent」を作成して
います。次に、現在の要素数分ループ処理を行い、(a)を求められていま
す。これは、単純に、content配列の内容をnewContentへセットしていま
す。
従って解答は、?となります。その後、capacityとcontentの内容を更新し
ています。
(b)
ここでは、実際にスタックへ引数「value」をセットする処理です。
スタックの配列「content」でいくつまでスタックされたかは、変数
「n_elements」で管理されています。
よって、スタックする際は、この変数を「+1」する必要があります。
よって正解は、content[?]となり??が正解となります。ここでのポイント
は、変数「n_elements」は、例えば、スタックの3番目に格納した場合は、
「3」となっていることに注目して下さい。(次に格納する要素の値となって
いる。つまり、+1としている)
また、解答欄の「キ」のcontent[n_elements+1]の場合も正しいように思え
ます。これは、n_elementsの初期値が「0」ですから、+1はしていますが、
変数「n_elements」へ内容をを格納していません。従って、n_elementsの
値は、永遠に「0+1=1」となり、常に、n_elementsは「0」のままとなります。
別の記述としては、
n_elements = n_elements + 1;(または、n_elements++;)
content[n_elements] = value;
でも問題なく動作します。
(c)
popメソッドを確認するとpeekメソッドを利用して変数n_elemnetsを-1して、
値を取得しています。
peekは、問題文にあるように「直前にスタックへ格納したデータを参照す
る」ものです。上記(b)のポイントで記載した通り、変数「n_elements」は、
次に格納(pash)する要素数+1となっています。
よって、直前の要素数は、n_elements-1となります。よって、content[?]
となり、正解は、??となります。
(d)
プログラム2のスタックのオブジェクト「stack」へ標準入力の内容をpushし
て、最後にまとめて、popにより出力するものです。
(d)では、この出力の条件を求められています。ポイントは、popメソッドに
よって、n_elementsが「0」の時は、空のスタックになるということです。
よって、プログラム1で、empty()メソッドが定義されています。これは、ス
タックが空の時に「true」を返します。
よって解答は、スタックが空でない時の条件「?」となり、正解は??とな
ります。
スタックを配列によって実現したプログラムです。スタックに
ついて知らなくても問題文より把握出来るかと思います。ま
た、標準入力についても問題文に説明があるため、こちらも
知らなくとも理解は可能かと思います。この問題のポンイト
は、変数「n_elements」の役割を見抜くことが重要です。