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日券,2日券といった日数の異なる種類のチケットの金額計算に対応できるように,〔処理内容〕の(2)及び関数の仕様を変更し,引数にチケットの日数を表すMを追加した。Mには使用できる日数が入る。種類別のチケット金額を設定する配列をTP(M, N)とする。Nは大人の場合は1,子供の場合は2とする。配列の値は次のとおりである。引数がJ=10, K=20, M=2のときの合計金額は何円か。 なお,関数は,引数に応じてこの配列を参照し,チケット金額を決定する。 〔配列の値〕 TP(1, 1) = 3,000, TP(1, 2) = 1,000, TP(2, 1) = 4,000, TP(2, 2) = 1,500, TP(3, 1) = 5,000, TP(3, 2) = 2,000
平成23年度 特別試験 ITパスポート試験 問96
这道题的解析和你的作答记录。
問 96面对规格变更型的设问,铁则是分清「哪里改了、哪里没改」
※ 编写解析时的验算未能完全确认公布答案;判定仍按 IPA 公布的答案。
错误ア
这是无视 M=2(2日票),用1日票的票价 TP(1, 1)=3,000日元 和 TP(1, 2)=1,000日元 计算后再打九折得到的值:(3,000×10 + 1,000×20)×0.9 = 50,000×0.9 = 45,000日元。(3) 的折扣处理适用得没错,但漏读了参数 M 的含义——M 表示可使用的天数,它决定数组 TP(M, N) 的第1个参数(取哪一行)——结果错取了 TP(1, N) 那一行。因为 M=2,应当使用的是 TP(2, N) 这一行。
错误イ
这是行选择和折扣两者都漏掉的值。用1日票的票价算出 3,000×10 + 1,000×20 = 50,000日元,就直接当成了答案。既然指定了 M=2,就必须使用 TP(2, 1)=4,000日元 和 TP(2, 2)=1,500日元;而且 J+K = 30张,还必须适用 (3) 的九折。由于漏掉了两处处理,所以是错误的。
- ウ
正解 正确答案是 ウ 的 63,000日元。本题建立在中题B(问93~96)的共同前提之上。共同的〔处理内容〕分三步:(1) 若不满足购买条件(成人、儿童均为0~20张),就把 −1 赋给合计金额;(2) 若满足,则计算 合计金额 = 成人张数×成人票价 + 儿童张数×儿童票价;(3) 若合计购买20张以上,则对合计金额打九折(减免一成)。本题改动的只有 (2),把票价从固定值(成人3,000日元、儿童1,000日元)改为从数组 TP(M, N) 中取值。也就是说,(1) 的购买条件检查和 (3) 的九折依然有效。把 J=10(成人张数)、K=20(儿童张数)、M=2(2日票)代入其中。首先看 (1):J=10 和 K=20 都在0以上20以下,满足购买条件,因此不会变成 −1。接着看 (2):要引用的是 M=2 的那一行,即 TP(2, 1)=4,000日元(2日票·成人)和 TP(2, 2)=1,500日元(2日票·儿童)。打折前的合计金额为 10×4,000 + 20×1,500 = 40,000 + 30,000 = 70,000日元。最后看 (3):购买张数合计为 J+K = 10+20 = 30张,达到20张以上,所以适用九折,70,000×0.9 = 63,000日元。引用数组时选中 M=2 的那一行,以及最后务必执行未被改动的九折处理——能否把这两步都做到,正是本题的要点。
错误エ
数组的引用是正确的,从 M=2 的那一行取到了 TP(2, 1)=4,000日元 和 TP(2, 2)=1,500日元。但 10×4,000 + 20×1,500 = 70,000日元 是打折前的金额,忘记了适用〔处理内容〕(3) 的九折。本题改动的只有 (2) 的金额计算,(3) 的折扣处理依然有效,既然 J+K = 30张(20张以上),就必定要打九折。答案是 70,000×0.9 = 63,000日元,这是最容易上当的错误选项。
- 面对规格变更型的设问,铁则是分清「哪里改了、哪里没改」。本题改动的只有〔处理内容〕(2) 的金额计算(固定票价→引用数组 TP),(1) 的购买条件检查和 (3) 的 合计20张以上打九折 都原样有效。漏掉未被改动的处理,计算就对不上。
- 引用二维数组 TP(M, N) 时,要准确读出第1个参数 M 对应票的天数(行)、第2个参数 N 对应成人=1、儿童=2(列)这一关系。M=2 时只使用 TP(2, 1) 和 TP(2, 2) 这一组,不去取 TP(1, *) 或 TP(3, *)。一旦弄错参数的顺序和含义,就会取到完全不同的票价。