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

PR広告

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

次の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("両プランで同額");
        }
    }
}

設問1

プログラム中の に入れる正しい答えを、解答群の中から選べ。

a に関する解答群

  • ア:abstract
  • イ:final
  • ウ:private
  • エ:protected
  • オ:public
  • カ:static

b に関する解答群

  • ア:i
  • イ:i - 1
  • ウ:i * 2
  • エ:i / 2
  • オ:i / 2 + 1
  • カ:i + 1

c、d に関する解答群

  • ア:[i + 1][0]
  • イ:[i + 1][1]
  • ウ:[i + 1][i]
  • エ:[i][0]
  • オ:[i][1]
  • カ:[i][i + 1]

設問1の解説

設問1はa, b, c, dの穴埋め問題です。

aは問題文に、TierTableは抽象クラスという記載があるので、「ア abstract」が入ります。

b, c, dは、実際にプログラムをトレースします。

[プログラム4]に

new TieredRateTable(0, 19.62, 120, 26.10, 300, 30.12)

とあります。

これは、[プログラム2]のTieredRateTableクラスのコンストラクタが呼ばれ、この中で、TierTableのコンストラクタTierTableを呼びます。

まず、長さが偶数であることを確認し、奇数の場合は例外処理に投げます。(throw new IllegalArgumentException)

次に

double[][] a = new double[tiers.length / 2][];

と配列を定義しています。これは例の場合「0, 19.62, 120, 26.10, 300, 30.12」を「0, 19.62」「120, 26.10」「300, 30.12」の3つのペアにします。

forループではi = 0から2つずつ値を増やします。

例の場合、tiers.length = 6なので、i = 0, i = 2, i = 4と3回ループします。

6つの値を2つペアで3つにします。その時配列aの添字は0, 1, 2と連番します。

そのため、aの配列はa[0], a[1], a[2]となります。

bには「エ i / 2」が入ります。

TierTableクラスのコンストラクタを通った結果、クラス変数pairsは次のようになります。

pairs[0][0] = 0, pairs[0][1] = 19.62

pairs[1][0] = 120, pairs[1][1] = 26.10

pairs[2][0] = 300, pairs[2][1] = 30.12

[プログラム2]のメソッドmapは与えられた値(電力量)から金額を返します。

問題文にある543.0kWhの場合、プランAの料金は

120kWhまでは

120 × 19.62 = 2,354.4円となります。

120kWhから300kWhは

(300 - 120) × 26.10 = 4,698円となります。

300kWh以上は

(543 - 300) × 30.12 = 7,319.16円となります。

これをプログラムで表現します。計算に使う変数はpairsにあります。

pairs[0][0] = 0, pairs[0][1] = 19.62

pairs[1][0] = 120, pairs[1][1] = 26.10

pairs[2][0] = 300, pairs[2][1] = 30.12

120kWhまでは

(120 - 0) × 19.62

= (pairs[1][0] - pairs[0][0]) × pairs[0][1]

と表現できます。

120kWhから300kWhは

(300 - 120) × 26.10

= (pairs[2][0] - pairs[1][0]) × pairs[1][1]

と表現できます。

300kWh以上は

(543 - 300) × 30.12

= (消費電力 - pairs[2][0]) × pairs[2][1]

と表現できます。消費電力は[プログラム2]ではamountという引数なので

= (amount - pairs[2][0]) × pairs[2][1]

となります。

cdは、120kWhと120kWhから300kWhを表現しています。

charge += (pairs[i + 1][0] - pairs[i][0]) * pairs[i][1]

とすると

120kWhまでは、i = 0なので

charge

+= (pairs[1][0] - pairs[0][0]) * pairs[0][1]

+= (120 - 0) * 19.62

となります。また

120kWhから300kHzまでは、i = 1なので

charge

+= (pairs[2][0] - pairs[1][0]) * pairs[1][1]

+= (300 - 120) * 26.10

となります。従って、

cには「ア [i + 1][0]」

dには「エ [i][0]」

が入ります!

平成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年度春 基本情報技術者試験 午前 テキスト・動画解説