本文へスキップ

平成23年度 特別試験 ITパスポート試験 問94

この問題の解説と、これまでの解答の記録です。

問94
頻出度★★★

Q社のRさんは,チケット販売システムの開発で使用する関数のプログラミングとテストを実施しようとしている。この関数は,大人と子供のチケットの購入希望枚数を基に,合計金額の計算を行う。大人のチケットは3,000円,子供のチケットは1,000円である。一度に購入できる大人と子供のチケットの最高枚数は,それぞれ20枚までであり,関数はこの購入条件を満たしているかどうかをチェックする。また,合計で20枚以上購入する場合,割引処理を行う。関数の仕様と処理内容は次のとおりである。 〔関数の仕様〕 関数に渡される引数  J:大人のチケットの購入希望枚数,K:子供のチケットの購入希望枚数  (J,Kは0以上の整数) 関数の戻り値  L:合計金額 (Lは整数) 〔処理内容〕 (1) 購入希望枚数を基に,購入条件を満たしているかどうかを判定する。購入条件を満たしていない場合,合計金額に−1を代入する。 (2) 購入条件を満たしている場合,引数を基に次のとおりに合計金額の計算を行う。   合計金額 = 大人のチケットの購入希望枚数×3,000+子供のチケットの購入希望枚数×1,000 (3) チケットを合計で20枚以上購入した場合は,合計金額から1割を割り引く。 関数のテストを行うために,条件のすべての組合せと処理を整理したものを表1に示す。表1のb,cに入れる適切な字句の組合せはどれか。 表1 条件のすべての組合せと処理

①②③④⑤⑥⑦⑧
条件Jが0以上20以下YYNNYYNN
条件Kが0以上20以下YYYYNNNN
条件J+Kが20より小さいYNYNYNYN
処理合計金額を求めるXX
処理合計金額を1割引とする-b
処理合計金額に−1を代入する--c

注記1 網掛けの部分は,表示していない。 注記2 Yは条件に該当し,Nは条件に該当しない。Xは処理を実行し,-は処理を実行しない。例えば①の場合,三つの条件に対する結果が,Y,Y,Yとなったとき,合計金額を求める処理が実行されることを示す。

出典 平成23年度 特別試験 ITパスポート試験 問94
解説

問 94

  • ア

    正解 正解はア (b:X、c:X)。表1は決定表 (デシジョンテーブル) で、上半分の条件部に三つの条件の Y/N の全組合せ (2の3乗=8通り) を列①〜⑧として並べ、下半分の動作部に各列で実行する処理を X (実行する) / - (実行しない) で示している。まず b を求める。条件1「Jが0以上20以下」と条件2「Kが0以上20以下」がともに Y、つまり引数が二つとも正常範囲である列は①と②の二つだけで、両者の違いは条件3「J+Kが20より小さい」が Y か N かだけである。①は 合計金額を求める=X、1割引=-、−1を代入=- であり、②も 合計金額を求める=X、−1を代入=- と①と同じである。ここでもし b が - だとすると、①と②は動作が完全に同じになり、条件3 は結果を何も変えない無意味な条件になってしまう。さらに「合計金額を1割引とする」という動作は、①でも②でも実行されないことになり (③以降は J か K が範囲外の異常系)、決定表にわざわざ動作行として掲げた意味が失われる。したがって b=X であり、この関数は「J も K も正常範囲で、かつ J+K が20以上のとき (まとめ買い) は合計金額を1割引にする」という仕様だと読み取れる。次に c を求める。列④は 条件1=N すなわち J が0以上20以下の範囲外であり、引数が不正なケースである。「合計金額に−1を代入する」は、正常に計算できなかったことを−1という異常値で呼出し元に知らせるためのエラー処理であり、実際に引数が二つとも正常な①②では - になっている。範囲外である④でこれを実行しなければ、異常値を返すという動作がどこでも働かず、不正な引数がそのまま見過ごされてしまう。よって c=X。b=X、c=X の組合せはアである。

  • 不正解イ

    b:X は正しいが c:- が誤り。列④は「Jが0以上20以下」= N であり、引数 J が有効範囲を外れた異常系のケースである。ここで「合計金額に−1を代入する」を実行しない (-) とすると、④ではどの動作も実行されないことになり、不正な引数を渡されても呼出し元に何も知らせないまま処理が終わってしまう。−1 の代入は計算不能を表す異常値を返すためのエラー処理であり、引数が範囲外の列でこそ実行されるべきものだから、c は X でなければならない。

  • 不正解ウ

    c:X は正しいが b:- が誤り。条件1・条件2 がともに Y (J も K も正常範囲) の列は①と②だけであり、b を - にすると①と②の動作が 合計金額を求める=X、1割引=-、−1を代入=- でまったく同一になる。すると条件3「J+Kが20より小さい」は結果に何の影響も与えない冗長な条件になり、全組合せを整理してテストする決定表の前提と矛盾する。加えて「合計金額を1割引とする」という動作が①〜⑧のどの正常系でも実行されないことになり、その動作行を設けた意味がなくなる。よって b は X である。

  • 不正解エ

    b:-、c:- は二つとも誤りで、イとウの誤りを重ねた組合せである。b を - にすると①と②の動作が同一になって条件3 が意味を失い、1割引の処理が一度も実行されない。c を - にすると引数 J が範囲外の④で異常値−1が設定されず、エラーを検出できない。決定表では、挙げた条件はいずれかの列で動作の違いを生み、挙げた動作はいずれかの列で実行されるのが原則であり、この選択肢はその両方に反する。

ここがポイント
  • 決定表 (デシジョンテーブル) の読み方 — 上段の条件部に条件の Y (該当する) / N (該当しない) の全組合せを列挙し、下段の動作部に各列で実行する処理を X (実行する) / - (実行しない) で表す。条件が n 個なら列は2のn乗通りになり、この問題では3条件なので①〜⑧の8列。条件の組合せに対する処理の対応を漏れなく重複なく整理できるので、仕様の確認やブラックボックステストのテストケース設計に用いられる。
  • 空欄を埋める論理 — 決定表では、掲げた条件はどこかの列で動作の違いを生み、掲げた動作はどこかの列で実行されるのが原則。条件の値だけが違う二列 (①と②) の動作が同一になる埋め方は、その条件を冗長にするので誤り。また引数の範囲チェック (0以上20以下) を外れた列では、計算不能を示す異常値 (ここでは−1) を返す処理を実行するのが定石である。
用語

解答の記録