JAVA入門

JAVA入門後期⑩
情報処理試験例題解説
H14年度秋問8 次のJavaプログラムの説明及びプログラムを読んで,設問に
答えよ。
〔プログラムの説明〕
ディジタル論理回路シミュレータを作成するためのクラスとテスト用クラスであ
る。
(1) ゲートを表す抽象クラス Gate のサブクラスとして, NOT ゲートを表すクラ
ス NotGate 及び ANDゲートを表すクラス AndGate を定義する。
(2) Gate のすべてのサブクラスは,メソッド connectOutputTo,getInput 及び
getOutput を継承し,メソッド tick を実装する。
(3) メソッド connectOutputTo は,ゲートの出力信号線を,指定されたゲート
の入力信号線に接続する。
(4) メソッド getInput 及び getOutput は,ゲートの入力信号線及び出力信号
線をそれぞれ返す。
(5) メソッド tick は,各ゲート固有の演算を実行し,出力信号線に true 又は
falseのいずれかの値を出力する。
(6) クラス Wire は,入力信号線又は出力信号線を表す。
(7) 各ゲートの出力信号線は,1本とする。
(8) テスト用クラス LogicCircuitTest で作成する回路及び動作の例を,次に
示す。メソッド main は,演算結果の値を標準出力に表示する。
〔プログラム〕
class Wire {
private boolean value;
public boolean getValue() { return value; }
public void setValue(boolean value) { this.value = value; }
}
abstract class Gate {
protected Wire[] input;
protected Wire output;
public Gate(int nInputs) {
a
input =
;
for (int i = 0; i < nInputs; i++) { input[i] = new Wire(); }
output = new Wire();
}
public void connectOutputTo(Gate otherGate, int nthInput) {
try {
;
b
} catch (Exception e) {
e.printStackTrace();
}
}
public Wire getInput(int n) { return input[n]; }
public Wire getOutput() { return output; }
abstract public void tick();
}
class NotGate extends Gate {
public NotGate() { super(1); }
public void tick() { output.setValue( c ); }
}
class AndGate extends Gate {
public AndGate() { super(2); }
public void tick() { output.setValue( d ); }
}
public class LogicCircuitTest {
public static void main(String[] args) {
Gate not = new NotGate();
Gate and = new AndGate();
not.connectOutputTo(and, 0);
not.getInput(0).setValue(false);
and.getInput(1).setValue(true);
not.tick();
and.tick();
System.out.println(and.getOutput().getValue());
}
}
設問 プログラム中の に入れる正しい答えを,解答群の中か
ら選べ。
a に関する解答群
ア new Wire(nInputs)
イ new Wire[nInputs]
ウ new Wire()
エ new Wire[] {new Wire()}
b に関する解答群
ア input[nthInput].setValue(otherGate.output.getValue())
イ input[nthInput] = otherGate.output
ウ otherGate.input[nthInput].setValue(output.getValue())
エ otherGate.input[nthInput] = output
c,d に関する解答群
ア input[0].getValue() || input[1].getValue()
イ !input[0].getValue() || !input[1].getValue()
ウ input[0].getValue() && input[1].getValue()
エ !input[0].getValue() && !input[1].getValue()
オ input[0].getValue() != input[1].getValue()
カ input[0].getValue()
キ !input[0].getValue()
ク 1 - input[0].getValue()
平成14年度秋問8
(問題概要)
この問題は、論理回路をJavaで実現するものです。
(前提知識)
●抽象クラス
●super
(解説)
問題文のプログラムの説明をよく理解することが前提です。
[クラスWireについて]
boolern型の変数「value」の取得と設定のクラスです。
解説
(a)
回路の例を見てわかる通り、入力は複数ですが、出力は1
個となっています。よって「input」はWire型の配列として定義
して、「output」はWire型の変数として定義しています。
次がこのクラスのコンストラクタの部分です。上記のinputと
outputは定義しただけで実際にはメモリ上には存在していま
せん。newを使用することによってオブジェクトとなります。
for文を確認すると、コンストラクタの引数(nInputs)分、ルー
プしています。
ここでnewを使用して配列inputへWireのオブジェクトを格納
しています。よって解答「a」は、inputの配列要素をnewで確
定する必要があります。
従って、input =?となります。
(b)
メソッドのconnectOutputToは、プログラムの説明(3)を確認します
。ここでこの処理は、回路図の「NOTの出力をANDの入力」へして
います。これを実現するためのメソッドです。ここで最後のテスト用
のクラスで「not.connectOutputTo(and , 0);」に注目します。この処
理がNOTの出力をANDの入力としています。そのためには、引数
otherGateをinputとして、これにoutputを代入します。
解答は、? となります。
(c)
クラスNotGateの実装です。コンストラクタで、super(1)とあります。
これは、スーパークラスのコンスクラクタの実行わ行います。引数
に「1」をセットいるのは、inputの配列の要素数は1個のみだからで
す。メソッドtickは、NOT処理ですから、解答は、?となります。
(d)
クラスAndGateの実装です。コンストラクタで、super(2)とあるのは、
ANDの場合は、inputが2個必要だからです。よって、tickの解答の
部分は、input(0)とinput(1)の論理積となります。解答は、?となり
ます。
(テスト用のクラスについて)
最初の2行で、notとandの名前のオブジォクトをそれぞれ作成し
ています。実際にはコンストラクタもこの際に実行されますので
、inputの配列の要素数も決定します(2個です)。3行目は、上記
の(b)の通りです。4行目と5行目で回路に入力する最初の値を
設定しています。次のtick()で、NOT演算、AND演算を行い、最
後に、この結果を出力しています。
「protected」は「このメソッドを定義したクラスやサブクラス及び
同じパッケージから呼び出し可能」です。
平成15年度春問8 次のJavaプログラムの説明及びプログラ
ムを読んで,設問に答えよ。
〔プログラムの説明〕
図形の面積を計算し,その結果を出力するプログラムである。
図形は,三角形,長方形及び正方形のいずれかであり,プ
ログラムでは,次の属性をもつ図形オブジェクトとして定める。
三角形:3辺の長さ
長方形:縦と横の2辺の長さ
正方形:1辺の長さ
このプログラムは,次の五つのクラスで構成される。
AreaTest
メソッド main をもつクラスである。このクラスは,次の処理を行う。
(1) 三角形,長方形及び正方形のオブジェクトを生成し,配列
figures に設定する。
(2) 各図形の面積を求めて,結果を出力する。ここで,各図形に
は,正しい図形となる数値が与えられているものとする。
Figure
図形の抽象クラスである。このクラスは,面積を計算してその結
果を返す抽象メソッド getArea を宣言している。
Triangle
三角形のクラスである。このクラスは,属性を文字列にして返すメ
ソッド
toString と三角形の面積をへロンの公式によって計算してその結
果を返すメソッド getArea を定義している。
Rectangle
長方形のクラスである。このクラスは,属性を文字列にして返すメソッド
toString と長方形の面積を計算してその結果を返すメソッド getArea を
定義している。
Square
正方形のクラスである。このクラスは,属性を文字列にして返すメソッド
toString を定義している。
プログラム1の実行結果を図に示す。
Triangle : sides = 2.0, 3.0, 3.0 : area = 2.8284271247461903 Rectangle :
height = 5.0, width = 8.0 : area = 40.0 Square : width = 5.0 : area = 25.0
図 実行結果
〔プログラム 1〕
public class AreaTest {
public static void main(String args[]) {
Figure[] figures = {
new Triangle(2, 3, 3),
new Rectangle(5, 8),
new Square(5)};
for (int i = 0; i < figures.length; i++) {
System.out.println(figures[i] +
"area = " + figures[i].getArea());
}
}
}
〔プログラム 2〕
public abstract class Figure {
public abstract double getArea();
}
〔プログラム 3〕
a
public class Triangle extends
{
double la;
double lb;
double lc;
public Triangle(double la, double lb, double lc) {
this.la = la;
this.lb = lb;
this.lc = lc;
}
public String toString() {
return "Triangle : sides = " + la + ", " + lb + ", " +
lc + " : ";
}
public double getArea() {
double s = (la + lb + lc) / 2.0;
return Math.sqrt(s * (s - la) * (s - lb) * (s - lc));
}
}
〔プログラム 4〕
public class Rectangle extends
b
{
double height;
double width;
public Rectangle(double height, double width) {
this.height = height;
this.width = width;
}
public String toString() {
return "Rectangle : height = " + height +
", width = " + width + " : ";
}
public double getArea() {
return
}
}
c
;
〔プログラム 5〕
public class Square extends
{
d
public Square(double width) {
;
e
}
public String toString() {
return "Square : width = " + width + " : ";
}
}
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。解答
は,重複して選んでもよい。
a,b,d に関する解答群
ア abstract
イ Figure
ウ getArea
エ Rectangle
オ Square
カ super
c に関する解答群
ア height
イ height * height
ウ height * width
エ width
オ width * width
e に関する解答群
ア super(height)
イ super(height, height)
ウ super(width)
エ super(width, height)
オ super(width, width)
カ this.height = height
キ this.height = width
ク this.width = height
ケ this.width = width
H15春問8解説
(問題概要)
この問題は、[プログラムの説明]より、三角形・長方形・正方形の
面積を求めて、出力するプログラムです。クラスは、5個から構成
されています。 (前提知識)
この問題で問われているのは、以下の点です。
●抽象クラスの概念
●継承
●オーバーライド(子クラスでのメソッドの再定義)
●super
●toString()メソッド
これらの知識があれば容易に解答出来る問題かと思います。
(解説)
[プログラム1]について
ここからJavaのプログラムがスタートしています。問題文の通り、3つのク
ラスのオブジェクトを作成して、抽象クラスの配列へ格納しています。配
列の要素は、0,1,2となります。これをfor文を使用して、3つの図形の面積
を出力しています。
[プログラム2]について
これが抽象クラスです。キーワードは、「abstract」です。classの前にある
とこのクラスは抽象クラスとなります。、抽象クラスでは、「抽象メソッド」と
いう本体の記述のないメソッドを定義出来ます。実際の本体は、抽象クラ
スをスーパークラスとして継承して、このクラスで本体を記述するもので
す。つまり、抽象クラスは、継承されることを前提としています。そして、
抽象メソッドは、継承されたサブクラスで、実際の処理を記述します。
[プログラム3]について
これは、三角形のクラスです。ここで「this」がありますが、これは、自分
自身のクラス内という意味です。ここで、「a」を解答する場合、ポイントと
しては、抽象メソッドの「getArea()」が再定義されていれば、抽象クラスか
らの継承と考えられます。つまり、解答は、?です。
[プログラム4]について
長方形のクラスです。解答の「b」については、上記と同様に抽象メソッドが再
定義されていますので、解答は、「Fiqure」てとなります。
解答の「c」については、実際の長方形の面積を求める処理となります。これ
は、縦×横ですから、?となります。
[プログラム5]について
正方形のクラスです。このプログラムを見ると、抽象メソッドがありません。こ
こに、まず注目して下さい。長方形は「縦×横」です。
正方形は「横×横か縦×縦」です。
この特性を利用すれば、上記の長方形クラスを利用することが可能です。
ですから、「d」については、クラス「?」から継承されていると考えられます。こ
れを検証するために、解答「e」について確認します。
eはコンストラクタの処理内容を問われています。これは、引数のwidthを利
用してスーパークラスのコンスクラクタを実行するようにすれば良い訳です。
このような場合、superというキーワードを使用します。この際の注意点として
、スーパークラスのコンストラクタには引数が2つあります。
しかし、プログラム5のコンストラクタの引数は1個です。
つまり、super(width, width)とすれば、Rectancegleクラスのコンスクラクタ
が呼び出されます。これによって、プログラム5でも、getAreaが利用する
ことが出来ます。これが継承の利点でもあります。
メソッドは上記の3つのオブジェクトに実装されています。printlnで、オブ
ジェクトを指定した場合に、toString()メソッドが内部で呼び出されます。
よって、問題文のような出力結果となります。
(最後に)
プログラム1のfor文の処理を良く確認して下さい。画面に表示する処理
をしていますが、fiqures[i]がありますが、これでどうして、問題文のような
内容が出力されるのでしょうか?これは、fiqures[i]の中身は、三角形、
長方形、正方形のオブジェクトを格納しています。そのオブジォクトを出
力しています。これは、toString()メソッドにあります。このメソッドは上記
の3つのオブジェクトに実装されています。printlnで、オブジェクトを指定し
た場合に、toString()メソッドが内部で呼び出されます。よって、問題文の
ような出力結果となります。