本文へスキップ

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

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

問95
頻出度★★★

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割を割り引く。 関数をテストするために用意したテストデータと予想結果の一部を表2に示す。表2のd,eに入れる値の組合せはどれか。 表2 テストデータと予想結果の一部

テスト番号JKL
13211,000
21515d
3200(網掛け)
41030e
⋮⋮⋮⋮

注記 網掛けの部分は,表示していない。

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

問 95

※ この問題は、解説作成時の検算で公表解答を確認しきれませんでした。判定は IPA 公表の解答どおりです。

  • 不正解ア

    d=54,000 は正しいが、e=54,000 が誤り。テスト4 は K=30 で、一度に購入できるのは子供チケットも20枚までという購入条件に違反している。関数は最初の条件チェック (0≦J≦20 かつ 0≦K≦20) で No となり、金額計算の分岐には一切入らず L=−1 を返す。54,000 という値は、条件チェックを飛ばして 3,000×10+1,000×30=60,000 を計算し、J+K=40≧20 として 0.9 を掛けてしまった場合に出る数値であり、購入条件の判定を無視した誤りである。

  • イ

    正解 正解はイ (d:54,000、e:−1)。この関数は、中問B の〔処理内容〕のとおり、(1) まず購入条件のチェック、(2) 条件を満たす場合だけ合計金額の計算、(3) 合計20枚以上なら1割引、という順で処理する。購入条件は、一度に購入できる枚数が大人・子供それぞれ20枚までであること、すなわち 0≦J≦20 かつ 0≦K≦20 であり、これを満たさなければ金額計算を行わずに L に −1 を代入して終了する。条件を満たす場合は L=3,000×J+1,000×K を求め、さらに J+K≧20 のときだけ1割引、つまり 0.9 を掛ける。まず既知のテスト1 でこの計算モデルを検証すると、J=3、K=2 は両方とも20以下で条件を満たし、J+K=5 で20未満だから割引はなく、L=3,000×3+1,000×2=9,000+2,000=11,000 となり表2の値と一致する。次に d を求める。テスト2 は J=15、K=15 でどちらも20以下なので購入条件は成立し、J+K=30 で20以上なので割引が適用され、L=0.9×(3,000×15+1,000×15)=0.9×(45,000+15,000)=0.9×60,000=54,000。よって d=54,000 である。続いて e を求める。テスト4 は J=10 は20以下だが K=30 が上限の20枚を超えており、大人・子供それぞれ20枚までという購入条件を満たさない。この場合は金額計算の分岐に入らず、〔処理内容〕(1) により L=−1 が代入されて終了するので e=−1 である。d=54,000 かつ e=−1 の組合せはイだけであり、イが正解となる。テスト4 のように条件を満たさない異常系で −1 が返ることを確かめるのも、テストデータの重要な役割である。

  • 不正解ウ

    d、e ともに誤り。d=60,000 は、テスト2 (J=15、K=15) について 3,000×15+1,000×15=60,000 と割引前の金額を求めたところで止めた値である。J+K=30 は20以上なので〔処理内容〕(3) の1割引が必ず適用され、正しい予想結果は 0.9×60,000=54,000 でなければならない。e=54,000 が誤りである理由はアと同じで、テスト4 は K=30 が上限超過のため金額計算に進まず L=−1 となる。

  • 不正解エ

    e=−1 は正しいが、d=60,000 が誤り。テスト2 は J=15、K=15 でいずれも20以下なので購入条件は満たしており、合計金額は 3,000×15+1,000×15=60,000 と求まる。しかしここで終わりではなく、チケットを合計で20枚以上購入した場合は合計金額から1割を割り引くという規定があり、J+K=30 は20以上なので割引が適用される。したがって予想結果は 60,000 ではなく 0.9×60,000=54,000 である。60,000 は割引処理を適用し忘れた値にすぎない。

ここがポイント
  • テストデータの予想結果 (期待値) は、実装ではなく仕様どおりに処理を追って自分で求めるもの。本問の関数は、購入条件チェック (0≦J≦20 かつ 0≦K≦20) → 満たさなければ L=−1、満たせば 合計金額 L=3,000×J+1,000×K → さらに J+K≧20 なら1割引 (×0.9)、という分岐の順序が決め手であり、この順序を守れば d=54,000、e=−1 が機械的に決まる。
  • 境界値と異常系の押さえ方 — 上限20枚を1枚でも超えたら (K=30 など) 金額計算に進まずエラー値 −1 を返す、合計20枚ちょうどでも J+K≧20 なので割引が適用される、といった境界と例外の振る舞いを狙ってテストデータを用意するのがテスト設計の基本。既知のテスト1 (J=3、K=2 → 11,000) で計算モデルを検算してから未知の欄を埋めると、割引の掛け忘れなどのミスを防げる。
用語

解答の記録