跳到正文

平成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张以上则减价一成(打九折)。购买条件是一次能购买的张数为成人票、儿童票各自最多20张,即 0≦J≦20 且 0≦K≦20;不满足时就不进行金额计算,直接给 L 赋 −1 并结束。满足条件时求出 L=3,000×J+1,000×K,然后仅当 J+K≧20 时减价一成,即乘以 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) 的减价一成必定适用,正确的预期结果必须是 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张以上门票时要从合计金额中减价一成,而 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 则减价一成(×0.9)。只要遵守这个顺序,d=54,000、e=−1 就能机械地确定下来。
  • 边界值与异常情况的把握方法 —— 只要超过上限20张哪怕一张(如 K=30),就不进入金额计算而返回错误值 −1;合计正好20张时,因为 J+K≧20 也要适用折扣。有意识地瞄准这类边界与例外行为来准备测试数据,是测试设计的基本功。先用已知的测试1(J=3、K=2 → 11,000)验算计算模型,再填写未知的空栏,就能防止漏乘折扣之类的失误。
用語
解答問95イ
练这一题

作答记录