平成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 Stirng("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 空欄1;
   }

   public boolean colorIs(){
      return 空欄2;
   }

   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){
       空欄3;
       this.buttonFront = buttonFront;
   }

   public String toString(){
       return 空欄4;
   }
}
設問
プログラムの空欄にいれる正しい答えを、解答群の中から選べ
空欄1,2に関する解答群
 this.size = size        イ this.size == size
 this.size.equals(size)     エ this.color = color
  this.color == color       this.color.equals(color)
空欄3に関する解答群
ア super()
イ super(buttonFront)
ウ super(code, size, color)
エ super(code, size, color, buttonFront)
空欄4に関する解答群
ア code + "," + size + "," +color
イ code + "," + size + "," +color + "," + buttonFront
ウ super.toString() + "," + buttonFront
エ super.toString() + "," + (buttonFront ? "button" : "zipper")
設問の解説
プログラムの概要を見てみると、TestPantsクラスを定義して、for文で配列の要素を表示させています。
2つのサブクラス、SlacksとJeansがあり、そのスーパークラスはPantsです。
また、「abstract class Pants{ 」からは、メソッド本体がない抽象メソッドを含む抽象クラスです。
次の行から3行で、インスタンス変数code、size、colorを定義しています。
空欄1、空欄2を含む業は、booleanでsizeとcolorをチェックしています。
空欄2の次の2行で、codeとsizeとcolorを","でつなげています。
続けて、サブクラスSlacksでは、スーパークラスの引数つきコンストラクタの呼び出しを行っています。
続くサブクラスJeansでは、「打ち合いがボタン留めかファスナー留めであるかを示す属性」(buttonFront)を持ちます。
空欄1
 また、空欄1で真偽を返すので、アとエはありえない。そして、sizeは、int型(基本型)で定義されているので、「==」を用います。
したがって、空欄1はイの
   this.size==size
が入ります。
 また、thisキーワードは、実行中のオブジェクトを指し示し、変数の前につけると、クラスのフィールドであることを示します。
空欄2
 colorはStringクラスで基本データ型ではありません。したがって、等しいかどうかに「==」を用いることはできません。String型の場合文字列が等しいかどうかを判定するのは、equalsメソッドと使い、A.equals(B) という風に用います。
したがって、空欄2はカの
   this.color.equals(color)
が入ります。
空欄3
 変数code、size、colorは、スーパークラスから継承しますが、buttonFrontは設問の条件から、ジーンズ(Jeans)の場合だけなので、注意が必要です。したがって、空欄3はウの
   super(code、size、color)
が入ります。
空欄4
 設問中の「実行結果」の中の3〜4行目にジーンズの場合、”zipper”か”button”かの表示を出しています。このことに注意してみてみると、エになります。
 次のJavaプログラムを読んで、設問1〜3に答えよ。

「プログラムの説明」
ある会社の情報管理部門で導入するコンピュータの候補として、ワークステーションとパーソナルコンピュータが提案されている。これらのコンピュータの値引き後の価格の計算を行い、コンピュータの仕様を価格の降順に整列して出力するプログラムである。コンピュータの仕様はつぎの4つからなる。

   機種名、 動作周波数、 メモリ容量、 価格

このプログラムは、次の4つのクラスと1つのインターフェイスで構成される。

Computer
  コンピュータに関するクラスであり、価格を返すメソッドgetPrice、価格を格納するメソッドsetPrice、仕様を文字列で返すメソッドgetDiscountRate、および整列する際に用いるデータの大小を比較するメソッドcompareWithを定義している。

Workstation
  クラスComputerのサブクラスとして定義されたワークステーションに関するクラスであり、ワークステーションの値引率を返すメソッドgetDiscountRateを再定義している。

PersonalComputer
  クラスComputerのサブクラスとして定義されたパーソナルコンピュータに関するクラスであり、パーソナルコンピュータの値引率を返すメソッドgetDiscountRateを再定義している。

PriceUtility
  値引き後の価格の計算と整列をするためのクラスであり、価格計算を行うメソッドcomputeDiscountPrice、および整列を行うメソッドsortを定義している。

IComp
  大小比較の対象を表すインターフェイスであり、比較を行うメソッドcompareWithを宣言している。

 プログラム1のメソッドmainとプログラム2〜6の実行結果を示す。このとき、メソッドmainの処理は次のとおりである。
(1)4つのコンピュータの仕様を生成し、配列computersに格納する。
(2)各コンピュータの仕様を出力する。
(3)値引き後の価格の計算を行う。
(4)整列を行う。
(5)整列結果を出力する。

実行結果
Ws1, frequency:800, memory:256, price:300000
Pc1, frequency:450, memory:128, price:180000
Ws2, frequency:800, memory:512, price:500000
Pc2, frequency:450, memory:256, price:200000

<sorted by price>
Ws2, frequency:800, memory:512, price:450000
Ws1, frequency:800, memory:256, price:270000
Pc2, frequency:450, memory:256, price:160000
Pc1, frequency:450, memory:128, price:144000
設問1 プログラム3,6の空欄に入れる正しい答えを解答群の中から選べ。
ア compareWith
イ computeDiscountPrice
ウ Computer
エ getDiscountRate
オ getPrice
カ IComp
キ PriceUtility
ク sort
設問2 プログラム3の行番号28を
return computer.frequency - this.frequency;
に変更したときのプログラム1の行番号16の出力として正しい答えを、解答群の中から選べ。
ア Pc1, frequency:450, memory:128, price:144000
    Pc2, frequency:450, memory:256, price:160000
    Ws1, frequency:800, memory:256, price:270000
    Ws2, frequency:800, memory:512, price:450000

イ Pc2, frequency:450, memory:256, price:160000
    Pc1, frequency:450, memory:128, price:144000
    Ws2, frequency:800, memory:512, price:450000
    Ws1, frequency:800, memory:256, price:270000

ウ Ws1, frequency:800, memory:256, price:270000
    Ws2, frequency:800, memory:512, price:450000
    Pc1, frequency:450, memory:128, price:144000
    Pc2, frequency:450, memory:256, price:160000

エ Ws2, frequency:800, memory:512, price:450000
    Ws1, frequency:800, memory:256, price:270000
    Pc2, frequency:450, memory:256, price:160000
    Pc1, frequency:450, memory:128, price:144000
設問3 プログラム5の行番号7を
return 0.4;
に変更したとき、各コンピュータの値引き後の価格として正しい答えを、解答群の中から選べ。
Ws1 Pc1 Ws2 Pc2
180000 108000 300000 120000
180000 144000 300000 160000
270000 108000 450000 120000
270000 144000 450000 160000
設問1の解説
空欄a
 プログラム3の行番号1の中にある、「implements」は、インターフェイスを実装するクラスを宣言しています。行番号1では、空欄aのインターフェイスを実装しているComputerクラスの宣言を行っています。
したがって、プログラムの説明から、ICompが入ることがわかります。よって、空欄aはカになります。
空欄b
 設問中の「実行結果」が価格順に整列されていることと、プログラム3の行番号26で、
  「public int compareWith (IComp a) { 」
とし、続いて、プログラム3の行番号28で
  「return computer.price - this.price; 」
としていることから、空欄bにはcomputerが入ります。したがって、ウになります。
空欄c
 プログラム6はプログラムの説明の(3)と(4)を処理しています。空欄cを含む行番号5〜7にかけて、価格に関する計算処理を行っています。getPriceは元の値段を返すメソッドなので、空欄cはオのgetPriceになります。
空欄d
 設問中の「実行結果」の中の3〜4行目にジーンズの場合、”zipper”か”button”かの表示を出しています。このことに注意してみてみると、エになります。
設問2の解説
プログラム3の行番号28によって、整列のキー項目が示されていることに注意すれば、設問の変更によって、入力順で、frequency順に整列されることがわかります。したがって答えは「ウ」。
設問3の解説
プログラム5の行番号7の値は、パーソナルコンピュータの値引率を0.4に変更することを示しています。ワークステーションの値引率は変えないので、Ws1、Ws2、Pc1、Pc2の価格、値引率、値引き後の価格は次の表のようになります。
価格 値引率 値引き後の価格
Ws1 300000 0.1 270000
Ws2 500000 0.1 450000
Pc1 180000 0.4 108000
Pc2 200000 0.4 120000
したがって答えは「ウ」。