跳到正文

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

这道题的解析和你的作答记录。

問93
頻出度★★☆

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のaに入れる適切な条件式はどれか。 図1 関数の処理の流れ図 - 開始 - 判定 [ a ] : No の場合 → L=−1 → 終了 - 判定 [ a ] : Yes の場合 ↓ - 判定 [ J+K≧20 ] : No の場合 → L=3,000×J+1,000×K → 終了 - 判定 [ J+K≧20 ] : Yes の場合 → L=0.9×(3,000×J+1,000×K) → 終了

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

問 93

  • ア

    正解 正确答案是 ア。首先读懂整张流程图的意图。这个函数是由 J 和 K 两个值求出金额 L 的,只有当判断 a 为 No 时,才把 −1 赋给 L 并结束。作为金额,−1 是不可能出现的值,所以它是用来告知调用方「无法计算」的错误值。也就是说,判断 a 的作用是检查传入的 J 和 K 是否落在允许计算的正确范围内,即输入检查(有效性检查):为 Yes 就作为正常值进入金额计算,为 No 就作为异常值以错误退出。既然是输入检查,那么只有 J 和 K 双方都同时处于范围内时才可以进入计算。ア 的「0≦J≦20 and 0≦K≦20」,是把关于 J 的 0 以上 20 以下这一条件与关于 K 的 0 以上 20 以下这一条件用 and(逻辑与)连接起来的表达式,因此只有同时满足两者时才为 Yes;只要其中任何一方是负数或超过 20,就为 No,即 L=−1。这正是输入检查应有的形式。此外,还可以确认这个条件与后续处理并不矛盾。通过了 ア 的 J 和 K 满足 0≦J≦20 且 0≦K≦20,所以和 J+K 可以取从 0 到 40 的值。因此下一个判断 J+K≧20 既可能为 Yes 也可能为 No,应用折扣的 L=0.9×(3,000×J+1,000×K) 分支与不打折的 L=3,000×J+1,000×K 分支都会被实际执行。流程图中写出的所有处理都可达,同时范围外的输入一定会被拒绝。能同时满足这两点的选项只有 ア,因此应填入 a 的恰当条件表达式就是 ア。

  • 错误イ

    「0≦J≦20 or 0≦K≦20」使用的是 or(逻辑或),所以只要 J 和 K 中有任意一方处于 0 以上 20 以下,就为 Yes,从而进入金额计算。例如 J=5、K=100 时,仅凭 J 的条件就为 Yes,于是会用范围外的 K=100 去计算金额。像 J=−30、K=10 这样一方为负数的情况同样会通过。这样就无法达成排除范围外数值这一输入检查的目的,返回错误值 L=−1 的分支几乎不起作用。这是把 and 与 or 弄混的典型错误。

  • 错误ウ

    「0≦J+K≦20」是只约束和的条件表达式,与「成人票和儿童票各自最多 20 张」的购买条件不一致。由于 J、K 是 0 以上的整数,和在 20 以下时各自的值也在 20 以下,但反过来会把满足条件的正当订单也拒绝掉。例如 J=15、K=10 各自都在 20 张以内、本可购买,但和为 25,所以为 No,返回 L=−1。此外,与后续判断之间的一致性也被破坏。满足这个条件而继续前进时,J+K≦20 得到保证,因此下一个判断 J+K≧20 为 Yes 的情形只有 J+K=20 这恰好一点,应用折扣的 L=0.9×(3,000×J+1,000×K) 分支几乎失去了意义。它作为输入检查并不充分,作为流程图的分支设计也不自然。

  • 错误エ

    「J>20 and K>20」把视为正常的范围弄反了,条件的方向是相反的。按这个表达式,J=1、K=1 这样普通的值全都为 No,变成 L=−1 的错误,只有当 J 和 K 都超过 20 时才会进入金额计算。而且以 Yes 前进时,由于 J>20 且 K>20,所以 J+K 必定超过 40,下一个判断 J+K≧20 始终为 Yes。结果,不打折的 L=3,000×J+1,000×K 分支就绝不会被执行,成为不可达的处理,这与流程图的记述相矛盾。

ここがポイント
  • 流程图的读解方法 —— 菱形的判断符号会对条件求值,并向 Yes / No 中的一方分支。在选择空栏中条件表达式的题目里,(1) 要从该分支之后在做什么来推断条件的作用,(2) 要验证无论填入哪个选项,流程图中的所有处理是否都可达。在求金额的函数中,返回 −1 这类不可能出现的值的分支,按惯例应读作表示输入检查(有效性检查)失败的错误处理。
  • and(逻辑与)与 or(逻辑或)的区分使用 —— and 只有在所连接的条件全部满足时才为真,or 只要满足其中任意一个就为真。在为多个变量分别设定有效范围的输入检查中,要用 and 把各个变量的范围条件连接起来。此处如果用 or,即使一方处于范围外也会通过,无法起到检查的作用。
用語
解答問93ア
练这一题

作答记录