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

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
プログラミング基礎I(再) 山元進.
Applet 岡部 祐典 鈴木 敬幸.
プログラミング基礎I(再) 山元進.
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
アルゴリズムとプログラミング (Algorithms and Programming)
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
オブジェクト指向入門.
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
アルゴリズムとデータ構造 2011年6月20日
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
前回の練習問題.
演習1 : インターフェイスを使ってみよう 「10人の客(乗用車、バイク、ストーブのいずれかランダムに決定)に1~100(L)の給油をするガソリンスタンドをシミュレートする実行クラス : RefuelSimulation」を作成する。給油の際には、どの種類の客が何リットル給油したか出力すること。 実行結果例.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
第8回放送授業.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
サブゼミ第7回 実装編① オブジェクト型とキャスト.
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
アルゴリズムとデータ構造 2012年6月21日
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

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

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

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

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

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

〔プログラム 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

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

設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。解答は,重複して選んでもよい。 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()メソッドが内部で呼び出されます。よって、問題文のような出力結果となります。