コンピュータ基礎および演習II

演習問題

解答は

に提出しなさい。クラスファイル (〜.class) は提出しなくてよい。 提出には gFTP 等の ftp ソフトを用いること。

問題1

以下に挙げる各組み合わせについて、その関係とそう判断した理由を述べなさい。 解答は文章でファイル Q1.txt に記述すること。

  1. ノートパソコン - ノートパソコン用のバッテリ
  2. 東京電機大学 - 情報メディア学科
  3. 東京電機大学の各学科 - 情報メディア学科
  4. 神田キャンパス - 15号館
  5. 東京23区に属する区 - 千代田区
  6. 千代田区 - 神田錦町

関係の選択肢:

参考: この大学の住所は東京都千代田区神田錦町2-2

ヒント1: 「is-a」という言葉にこだわると、 クラスとインスタンスの関係まで is-a の関係に見えてくるので注意すること。 惑わされる人は、先にクラスとインスタンスの関係かどうかを判断するとよい。 「A - B」でAがクラスの場合、BがクラスAの具体例であれば、 「A - B」はクラスとインスタンスの関係である。

ヒント2: ここで言う「has-a の関係」とは、クラスとクラスの関係であることに注意すること。

問題2

円柱(cylinder)を表すクラスを定義しなさい。 クラス名は Cylinder とする。 円柱の形状は、底面の半径(radius)と高さ(height)により定まる。 空間上の位置は考慮しなくてよい。

問題2-1

クラス Cylinder には、少なくとも以下のメソッドを実装しなさい。

また、底面の半径と円柱の高さを引数にとるコンストラクタを実装しなさい。

アクセスに関しては、以下の方針で設計しなさい。

なお、数値はすべて整数でよい。 円周率は3でよいが、Math.PI とするとπにもっとも近い double 値が得られる(参考)。

ファイル名は CylinderProperties1.java とする。 クラス CylinderProperties1 は次のようになる。

class CylinderProperties1 {
    public static void main(String[] args) {
	int radius = 5;
	int height = 10;
	Cylinder cylinder = new Cylinder(radius, height);
	System.out.println("円柱(半径=" + radius + ", 高さ=" + height + ")の");
	System.out.println(" 体積は" + cylinder.volume());
	System.out.println(" 表面積は" + cylinder.surfaceArea());
    }
}

問題2-2

円柱は、底面と側面からできている。 つまり、円柱と底面、円柱と側面の関係は has-a の関係である。 底面は円(circle)であり、側面は長方形(rectangle)である。 クラス Circle とクラス Rectangle を定義し、 これらを属性として持つようにクラス Cylinder を変更しなさい。 なお、Circle, Rectangle についてもアクセス制限に気を配ること。

クラス Circle に面積と円周、 クラス Rectangle に面積を求めるメソッドを実装し、 クラス Cylinder で体積や表面積を求めるときにそれらを用いること。

ファイル名は CylinderProperties2.java とする。 クラス CylinderProperties2 は次のようになる。

class CylinderProperties2 {
    public static void main(String[] args) {
	int radius = 5;
	int height = 10;
	Cylinder cylinder = new Cylinder(radius, height);
	System.out.println("円柱(半径=" + radius + ", 高さ=" + height + ")の");
	System.out.println(" 体積は" + cylinder.volume());
	System.out.println(" 表面積は" + cylinder.surfaceArea());
    }
}

円と長方形を生成しておいてクラス Cylinder のコンストラクタに渡すことも考えられなくはないが、 クラス Cylinder 内部でクラス Circle とクラス Rectangle のインスタンスを生成して用いることにより、 クラス Circle やクラス Rectangle の使い方を知らない人でもクラス Cylinder が使えるようになる。

注意: new によるインスタンスの生成はコンストラクタかメソッド内で行うこと。 属性を宣言する際にインスタンスを生成し代入することはできない。