総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成29年度春 基本情報技術者過去問 午後問11 ソフトウェア開発(Java) 設問2

次のJavaプログラムの説明及びプログラムを読んで、設問1、2に答えよ。

〔プログラムの説明〕

電気料金プラン(以下、プランという)を比較するためのプログラムである。電気料金は、基本料金、及び電気の使用量(以下、電力量という)から算出される電力量料金から成る。電力量の単位は、キロワット時(kWh)である。電力量料金を算出するための1kWh当たりの料金(以下、料金単価という)は、電力量に応じて段階的に変わる。プランA及びプランBの料金表を表1に示す。

表1 プランA及びプランBの料金表

プラン プランA プランB
基本料金(円) 1123.30 1040.10
料金単価(円/kWh) 120kWhまで 19.62 18.17
料金単価(円/kWh) 120kWh超過300kWhまで 26.10 24.17
料金単価(円/kWh) 300kWh超過分 30.12 27.77

例えば、プランAで、使用した電力量が200.5kWhのとき、120kWh分に対して19.62円/kWh、残りの80.5kWhに対して26.10円/kWhの料金単価が適用される。

(1) 抽象クラス TierTable は、段階的に変化する値のペアをテーブルとして表現する。値は、型doubleで与えられる。

 ① コンストラクタは、可変長の引数で与えられたdoubleの数値2個ずつをペアとして配列にし、更にその配列を要素とする配列を生成し、フィールド pairs に保持する。引数 tiers の長さが奇数のときは、IllegalArgumentException を投げる。

 ② 抽象メソッド map は、引数で与えられた数値を別の数値に変換して返す。

(2) クラス TieredRateTable は、料金単価のテーブルを表す。

 ① コンストラクタは、引数で与えられた電力量とそれに対応する料金単価のペアからテーブルを作成する。

 ② メソッド map は、引数で与えられた電力量から電力量料金を計算し、その値を返す。

(3) クラス RatePlan は、プランを表す。

 ① コンストラクタは、引数で与えられたプラン名、基本料金、料金単価のテーブルで表されるインスタンスを生成する。

 ② メソッド getName は、プラン名を返す。

 ③ メソッド getPrice は、引数で与えられた電力量から電力量料金を計算し、その値と基本料金の合計を型intの数値で返す。このとき、小数点以下は切り捨てられる。

(4) クラス Main は、表1を基にプランA及びプランBを表す RatePlan のインスタンスを生成し、電力量が543.0kWhのときの電気料金を比較する。メソッド main を実行すると、図1の結果が得られた。

プランBが1175円安い

[プログラム1]

a class TierTable {
    final double[][] pairs;
    
    TierTable(double... tiers) {
        if(tiers.length % 2 == 1) {
            throw new IllegalArgumentException("不正な長さ: " + tiers.length);
        }
        double[][] a = new double[tiers.length / 2][];
        for(int i = 0; i < tiers.length; i += 2) {
            a[b] = new double[] {tiers[i], tiers[i+1]};
        }
        this.pairs = a;
    }
    
    abstract double map(double amount);
}

[プログラム2]

class TieredRateTable extends TierTable {
    TieredRateTable(double... taiers) {
        super(tiers);
    }
    
    double map(double amount) {
        double charge = 0;
        for (int i = 0; i < pairs.length; i++) {
            if(i + 1 < pairs.length && amount > pairs[i+1][0]) {
                charge += (pairsa - pairsd) * pairs[i][1];
            } else {
                charge += (amount - pairs[i][0]) * pairs[i][1];
                break;
            }
        }
        return charge;
    }
}

[プログラム3]

class RatePlan {
    private final String name;
    private final double basicCharge;
    private final TierTable pricingTiers;
    
    RatePlan(String name, double basicCharge, TierTable pricingTiers) {
        this.name = name;
        this.basicCharge = basicCharge;
        this.pricingTiers = pricingTiers;
    }
    
    String getName() { return name; }
    
    int getPrice(double amount) {
        return (int) (basicCharge + pricingTiers.map(amount));
    }
}

[プログラム4]

public class Main {
    public static void main(String[] args) {
        RatePlan planA = new RatePlan("プランA", 1123.30,
            new TieredRateTable(0, 19.62, 120, 26.10, 300, 30.12));
        RatePlan planB = new RatePlan("プランB", 1040.10,
            new TieredRateTable(0, 18.17, 120, 24.17, 300, 27.77));
            
        double amount = 543.0;
        int d = planA.getPrice(amount) - planB.getPrice(amount);
        if (d < 0) {
            System.out.printf("%sが%d円安い%n", planA.getName(), -d);
        } else if (d > 0) {
            System.out.printf("%sが%d円安い%n", planB.getName(), d);
        } else {
            System.out.printf("両プランで同額");
        }
    }
}

設問2

割引プランは、指定した他のサービスを電気と一緒に利用した場合には、プランAやプランBという当初のプランで計算した電気料金を、電気料金の額に応じて割り引くプランである。割引プランの割引率の例を、表2に示す。

表2 割引プランの割引率の例

電気料金 割引率
5,000円未満 1%
5,000円以上8,000円未満 3%
8,000円以上 5%

プログラム5は、割引率を求めるためのクラス DiscountTable である。メソッド map は、引数で与えられた電気料金から割引率を求め、その値を返す。ここで、割引率は小数で与えるものとする。例えば、1%は0.01である。

[プログラム5]

class DiscountTable extends TierTable {
    DiscountTable(double... tiers) {
        super(tiers);
    }
    
    double map(double amount) {
        for (int i = pairs.lenth-1; i>= 0; i--) {
            if(amount >= pairs[i][0]) {
                return pairs[i][1];
            }
        }
        throw new IllegalArgumentException("amount = " + amount);
    }
}

プログラム6は、割引プランを表すためのクラス DiscountPlan である。 DiscountPlan は、クラス RatePlan を拡張し、上位クラスである RatePlan のメソッド getPrice で求めた電気料金から割引率を求め、割引を適用した金額を電気料金として計算する。プログラム中の に入れる正しい答えを、解答群の中から選べ。

[プログラム6]

class DiscountPlan e RatePlan {
    private final TierTable discountTiers;
    
    DiscountPlan(String name, double basicCharge,
                 TierTable pricingTiers, TierTable discountTiers) {
        super(name, basicCharge, pricingTiers);
        this.discountTiers = discountTiers;             
    }
    
    int getPrice(double amount) {
        int price = f.getPrice(amount);
        return (int) (price * g);
    }
}

e に関する解答群

  • ア:extends
  • イ:implements
  • ウ:imports
  • エ:public
  • オ:throws

f に関する解答群

  • ア:((RatePlan) this)
  • イ:RatePlan
  • ウ:super
  • エ:this
  • オ:TieredRateTable
  • カ:TierTable

g に関する解答群

  • ア:(1.0 - discountTiers.map(amount))
  • イ:(1.0 - discountTiers.map(basicCharge))
  • ウ:(1.0 - discountTiers.map(price))
  • エ:discountTiers.map(amount)
  • オ:discountTiers.map(basicCharge)
  • カ:discountTiers.map(price)

設問2の解説

設問2はe, f, gの穴埋めです。

問題文に

割引プランを表すためのクラスDiscountPlanである。DiscountPlanは、クラスRatePlanを拡張し

とあります。DiscountPlanはRatePlanを継承していることがわかります。

従って、eには「ア extends」が入ります。

fgは[プログラム6]にのgetPriceメソッドないにあります。

DiscountPlanのgetPriceメソッドは、計算した電気料金から割引します。元の電気料金を計算します。それはRatePlanのgetPriceメソッドを利用します。

DiscountPlanからは、super.getPrice()と呼びます。

fには「ウ super」が入ります!

割引率はdiscountTiers.mapメソッドを利用します。mapメソッドは計算された料金が引数になるので「disctountTiers.map(price)」となります。

disctountTiers.map(price)は割引率を求めるメソッドです。割引を適用する必要があります。実際の割引料金は

「price * (1.0 - discountTiers.map(price))」

となるので、gには「ウ price * (1.0 - discountTiers.map(price)」が入ります!

平成29年度春 基本情報技術者過去問 午後

問1 情報セキュリティ 設問1

問1 情報セキュリティ 設問2

問1 情報セキュリティ 設問3

問2 ハードウェア 業務経験が乏しく説得力ある解説ができる自信がありません。ご了承ください。

問3 データベース 設問1

問3 データベース 設問2

問3 データベース 設問3

問4 ネットワーク 業務経験が乏しく説得力ある解説ができる自信がありません。ご了承ください。

問5 ソフトウェア設計 設問1

問5 ソフトウェア設計 設問2

問5 ソフトウェア設計 設問3

問6 プロジェクトマネジメント 設問1

問6 プロジェクトマネジメント 設問2

問7 システム戦略 設問1

問7 システム戦略 設問2

問7 システム戦略 設問3

問8 データ構造及びアルゴリズム 設問1

問8 データ構造及びアルゴリズム 設問2

問11 ソフトウェア開発(Java) 設問1

問11 ソフトウェア開発(Java) 設問2

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説