Presentation is loading. Please wait.

Presentation is loading. Please wait.

JAVA入門後期⑩ 情報処理試験例題解説.

Similar presentations


Presentation on theme: "JAVA入門後期⑩ 情報処理試験例題解説."— Presentation transcript:

1 JAVA入門後期⑩ 情報処理試験例題解説

2 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 は,演算結果の値を標準出力に表示する。

3

4 private boolean value; public boolean getValue() { return value; }
〔プログラム〕 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) { input =      ; for (int i = 0; i < nInputs; i++) { input[i] = new Wire(); } output = new Wire(); a

5 public Wire getInput(int n) { return input[n]; }
public void connectOutputTo(Gate otherGate, int nthInput) { try {     ; } catch (Exception e) { e.printStackTrace(); } public Wire getInput(int n) { return input[n]; } public Wire getOutput() { return output; } abstract public void tick(); b

6 class NotGate extends Gate {
public NotGate() { super(1); } public void tick() { output.setValue( ); } } class AndGate extends Gate { public AndGate() { super(2); } 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()); c d

7 設問  プログラム中の に入れる正しい答えを,解答群の中から選べ。
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

8 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()

9 平成14年度秋問8 (問題概要) この問題は、論理回路をJavaで実現するものです。 (前提知識) ●抽象クラス ●super (解説) 問題文のプログラムの説明をよく理解することが前提です。 [クラスWireについて] boolern型の変数「value」の取得と設定のクラスです。

10 解説 (a) 回路の例を見てわかる通り、入力は複数ですが、出力は1個となっています。よって「input」はWire型の配列として定義して、「output」はWire型の変数として定義しています。 次がこのクラスのコンストラクタの部分です。上記のinputとoutputは定義しただけで実際にはメモリ上には存在していません。newを使用することによってオブジェクトとなります。 for文を確認すると、コンストラクタの引数(nInputs)分、ループしています。 ここでnewを使用して配列inputへWireのオブジェクトを格納しています。よって解答「a」は、inputの配列要素をnewで確定する必要があります。 従って、input =?となります。

11 (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)の論理積となります。解答は、?となります。

12 (テスト用のクラスについて) 最初の2行で、notとandの名前のオブジォクトをそれぞれ作成し ています。実際にはコンストラクタもこの際に実行されますので 、inputの配列の要素数も決定します(2個です)。3行目は、上記 の(b)の通りです。4行目と5行目で回路に入力する最初の値を 設定しています。次のtick()で、NOT演算、AND演算を行い、最 後に、この結果を出力しています。 「protected」は「このメソッドを定義したクラスやサブクラス及び 同じパッケージから呼び出し可能」です。

13 平成15年度春問8  次のJavaプログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕 図形の面積を計算し,その結果を出力するプログラムである。図形は,三角形,長方形及び正方形のいずれかであり,プログラムでは,次の属性をもつ図形オブジェクトとして定める。 三角形:3辺の長さ 長方形:縦と横の2辺の長さ 正方形:1辺の長さ このプログラムは,次の五つのクラスで構成される。

14 AreaTest メソッド main をもつクラスである。このクラスは,次の処理を行う。 (1) 三角形,長方形及び正方形のオブジェクトを生成し,配列 figures に設定する。 (2) 各図形の面積を求めて,結果を出力する。ここで,各図形には,正しい図形となる数値が与えられているものとする。 Figure 図形の抽象クラスである。このクラスは,面積を計算してその結 果を返す抽象メソッド getArea を宣言している。 Triangle 三角形のクラスである。このクラスは,属性を文字列にして返すメ ソッド toString と三角形の面積をへロンの公式によって計算してその結 果を返すメソッド getArea を定義している。

15 Rectangle 長方形のクラスである。このクラスは,属性を文字列にして返すメソッド toString と長方形の面積を計算してその結果を返すメソッド getArea を定義している。 Square 正方形のクラスである。このクラスは,属性を文字列にして返すメソッド toString を定義している。 プログラム1の実行結果を図に示す。 Triangle : sides = 2.0, 3.0, 3.0 : area = Rectangle : height = 5.0, width = 8.0 : area = 40.0 Square : width = 5.0 : area = 25.0                  図 実行結果

16 〔プログラム 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();

17 〔プログラム 3〕 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)); a

18 〔プログラム 4〕 public class Rectangle extends { 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 ; b c

19 public class Square extends { public Square(double width) { ; }
〔プログラム 5〕 public class Square extends { public Square(double width) { ; } public String toString() { return "Square : width = " + width + " : "; d e

20 設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。解答は,重複して選んでもよい。
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

21 H15春問8解説 (問題概要) この問題は、[プログラムの説明]より、三角形・長方形・正方形の面積を求めて、出力するプログラムです。クラスは、5個から構成されています。 (前提知識) この問題で問われているのは、以下の点です。 ●抽象クラスの概念 ●継承 ●オーバーライド(子クラスでのメソッドの再定義) ●super ●toString()メソッド これらの知識があれば容易に解答出来る問題かと思います。

22 (解説) [プログラム1]について ここからJavaのプログラムがスタートしています。問題文の通り、3つのクラスのオブジェクトを作成して、抽象クラスの配列へ格納しています。配列の要素は、0,1,2となります。これをfor文を使用して、3つの図形の面積を出力しています。 [プログラム2]について これが抽象クラスです。キーワードは、「abstract」です。classの前にあるとこのクラスは抽象クラスとなります。、抽象クラスでは、「抽象メソッド」という本体の記述のないメソッドを定義出来ます。実際の本体は、抽象クラスをスーパークラスとして継承して、このクラスで本体を記述するものです。つまり、抽象クラスは、継承されることを前提としています。そして、抽象メソッドは、継承されたサブクラスで、実際の処理を記述します。 [プログラム3]について これは、三角形のクラスです。ここで「this」がありますが、これは、自分自身のクラス内という意味です。ここで、「a」を解答する場合、ポイントとしては、抽象メソッドの「getArea()」が再定義されていれば、抽象クラスからの継承と考えられます。つまり、解答は、?です。

23 [プログラム4]について 長方形のクラスです。解答の「b」については、上記と同様に抽象メソッドが再定義されていますので、解答は、「Fiqure」てとなります。 解答の「c」については、実際の長方形の面積を求める処理となります。これは、縦×横ですから、?となります。 [プログラム5]について 正方形のクラスです。このプログラムを見ると、抽象メソッドがありません。ここに、まず注目して下さい。長方形は「縦×横」です。 正方形は「横×横か縦×縦」です。 この特性を利用すれば、上記の長方形クラスを利用することが可能です。 ですから、「d」については、クラス「?」から継承されていると考えられます。これを検証するために、解答「e」について確認します。 eはコンストラクタの処理内容を問われています。これは、引数のwidthを利用してスーパークラスのコンスクラクタを実行するようにすれば良い訳です。このような場合、superというキーワードを使用します。この際の注意点として、スーパークラスのコンストラクタには引数が2つあります。

24   しかし、プログラム5のコンストラクタの引数は1個です。
  つまり、super(width, width)とすれば、Rectancegleクラスのコンスクラクタが呼び出されます。これによって、プログラム5でも、getAreaが利用することが出来ます。これが継承の利点でもあります。   メソッドは上記の3つのオブジェクトに実装されています。printlnで、オブジェクトを指定した場合に、toString()メソッドが内部で呼び出されます。   よって、問題文のような出力結果となります。 (最後に) プログラム1のfor文の処理を良く確認して下さい。画面に表示する処理をしていますが、fiqures[i]がありますが、これでどうして、問題文のような内容が出力されるのでしょうか?これは、fiqures[i]の中身は、三角形、長方形、正方形のオブジェクトを格納しています。そのオブジォクトを出力しています。これは、toString()メソッドにあります。このメソッドは上記の3つのオブジェクトに実装されています。printlnで、オブジェクトを指定した場合に、toString()メソッドが内部で呼び出されます。よって、問題文のような出力結果となります。


Download ppt "JAVA入門後期⑩ 情報処理試験例題解説."

Similar presentations


Ads by Google