基本情報技術者 2013年 春期 午後 問09
次のCプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
ケーブルテレビ局を運営するU社では、有線テレビ視聴サービスとインターネット接続サービスを提供している。
(1) 有線テレビ視聴サービスでは、有線テレビ基本視聴契約(以下、基本視聴契約という)を結ぶと視聴できる基本放送チャンネル、及び基本視聴契約に加えて有料放送視聴契約を結ぶと視聴できる有料放送チャンネルを提供している。
(2) 基本視聴契約にはプラン1、プラン2の2種類があり、プラン2を選ぶと毎月の基本視聴料金はプラン1よりも高くなるが、有料放送視聴料金は割安になる。毎月の基本視聴料金は、表1のとおりである。

(3) 毎月の有料放送視聴料金は、基本視聴契約のプランと視聴契約する有料放送のチャンネル数によって決まる。
(4) 基本視聴料金と有料放送視聴料金の合計を、有線テレビ視聴料金という。
(5) インターネット接続サービスは、インターネット接続契約を結ぶと利用できる。インターネット接続サービスでは、低速回線と高速回線の2種類を提供している。毎月のインターネット接続サービス利用料金は、基本視聴契約の有無、プランの種類によって変わってくる。毎月のインターネット接続サービス利用料金は、表2のとおりである。

(6) 毎月の利用料金は、有線テレビ視聴料金とインターネット接続サービス利用料金の合計である。
(7) 関数calc_service_feeは、毎月の利用料金を求めるプログラムである。引数及び返却値は、次のとおりである。引数に誤りはないものとする。
引数:basic_plan 基本視聴契約(0:なし、1:プラン1、2:プラン2)
channel_num 視聴契約する有料放送のチャンネル数
inet_plan インターネット接続契約(0:なし、1:低速回線、2:高速回線)
返却値:毎月の利用料金

設問1:
問題文を見る 有線テレビ視聴料金に関する次の記述中のに入れる正しい答えを、解答群の中から選べ。
(1) calc_service_fee(1, 6, 0)を実行した場合、行番号23が2回目に実行されるときの変数cnumの値はaとなり、3回目に実行されるときの変数cnumの値はbとなる。また、行番号43が実行されるときの変数tv_feeの値はcとなる。
(2) 基本視聴契約がプラン1で有料放送6チャンネル分の視聴契約をする場合の有線テレビ視聴料金と、基本視聴契約がプラン2で有料放送6チャンネル分の視聴契約をする場合の有線テレビ視聴料金を比較した場合、d。
a, bに関する解答群
ア:0
イ:1
ウ:2
エ:3
オ:4
カ:5
キ:6
ク:10
cに関する解答群
ア:6600
イ:7200
ウ:8000
エ:9700
dに関する解答群
ア:どちらのプランでも有線テレビ視聴料金は等しい
イ:プラン1での有線テレビ視聴料金の方が高い
ウ:プラン2での有線テレビ視聴料金の方が高い
模範解答
a:イ、b:エ、c:エ、d:ウ
解説
解答の導き方
この設問では、プログラムが有料放送の料金をどのように計算するかを追い、その結果を使ってプランを比較します。引数(関数に渡す値)は、基本視聴契約のプラン、有料放送のチャンネル数、インターネット接続契約を表します。
(1) calc_service_fee(1, 6, 0)を実行する場合
引数は、basic_planが1、channel_numが6、inet_planが0です。まず、行番号16で基本視聴料金が設定されます。表1よりプラン1の基本視聴料金は3,000円なので、tv_feeは3,000になります。
次に、有料放送の料金を計算します。BLKNUMは4なので、繰返し処理の変数iは3から始まり、2、1、0の順に変わります。配列(値を順番に並べて扱う仕組み)の番号は0から始まります。
行番号19では、その時点で残っているチャンネル数から、現在の料金区分に該当するチャンネル数を計算します。計算結果が0未満なら、行番号20~22で0に直します。続く行番号23では、そのチャンネル数をchannel_numから差し引きます。
行番号23が2回目に実行されるのは、iが2のときです。このときのcnumは1です。3回目は、iが1のときで、cnumは3です。したがって、aは1、bは3です。
表の計算から、有料放送視聴料金は円です。基本視聴料金3,000円を加えると、tv_feeは円になります。
inet_planは0なので、インターネット接続契約はありません。インターネット接続サービス利用料金は0円です。行番号43ではtv_feeとinet_feeを加算しますが、設問で尋ねているtv_feeは9,700円のままです。したがって、cは9,700です。
(2) プラン1とプラン2の有線テレビ視聴料金を比較する場合
6チャンネル分の料金区分ごとのチャンネル数は、どちらのプランでも同じです。プログラムの計算を追うと、それぞれの区分に該当するチャンネル数は、順に2チャンネル、3チャンネル、1チャンネルです。
プラン1では、基本視聴料金が3,000円です。有料放送視聴料金は、プログラムにあるプラン1の料金から、円です。したがって、有線テレビ視聴料金は円です。
プラン2では、基本視聴料金が5,000円です。有料放送視聴料金は、プラン2の料金から、円です。したがって、有線テレビ視聴料金は円です。
プラン2では有料放送視聴料金が1,700円安くなりますが、基本視聴料金はプラン1より2,000円高くなります。そのため、合計ではプラン2のほうが300円高くなります。dは「プラン2での有線テレビ視聴料金の方が高い」です。
誤りやすいポイント
- 行番号23でchannel_numが更新されます。次の繰返しでは、最初の6チャンネルではなく、差し引いた後のチャンネル数を使います。
- 行番号19の計算結果が負になった場合は、そのまま料金計算に使わず、行番号20~22で0に直します。
- プラン1の料金を使うときは、channel_charge[basic_plan - 1]の添字が0になります。配列の番号は0から始まるためです。
- cが尋ねているのはtv_feeです。行番号43で返される料金全体と混同せず、基本視聴料金と有料放送視聴料金の合計を確認します。
- プランを比較するときは、有料放送視聴料金だけでなく基本視聴料金も加えます。また、比較対象は有線テレビ視聴料金なので、インターネット接続サービス利用料金は含めません。
FAQ
Q: なぜチャンネル数を料金区分ごとに分けて計算するのですか?
A: 有料放送視聴料金は、基本視聴契約のプランとチャンネル数によって決まるためです。プログラムは、チャンネル数の多い区分から順に、該当するチャンネル数を取り出して料金を計算します。
A: 有料放送視聴料金は、基本視聴契約のプランとチャンネル数によって決まるためです。プログラムは、チャンネル数の多い区分から順に、該当するチャンネル数を取り出して料金を計算します。
Q: プラン2の有料放送視聴料金が安いのに、なぜ合計は高くなるのですか?
A: プラン2では有料放送視聴料金が1,700円安くなりますが、基本視聴料金は2,000円高くなります。差し引きすると、合計はプラン2のほうが300円高くなります。
A: プラン2では有料放送視聴料金が1,700円安くなりますが、基本視聴料金は2,000円高くなります。差し引きすると、合計はプラン2のほうが300円高くなります。
Q: インターネット接続サービス利用料金をプラン比較に加えないのはなぜですか?
A: 比較するのは有線テレビ視聴料金だからです。有線テレビ視聴料金は、基本視聴料金と有料放送視聴料金の合計です。
A: 比較するのは有線テレビ視聴料金だからです。有線テレビ視聴料金は、基本視聴料金と有料放送視聴料金の合計です。
関連キーワード: 配列、添字、繰返し処理、条件分岐、料金計算
設問2:
問題文を見る プログラム中のに入れる正しい答えを、解答群の中から選べ。ただし、e1とe2に入れる答えは、eに関する解答群の中から組合せとして正しいものを選ぶものとする。
eに関する解答群
fに関する解答群
ア:== 0
イ:== 1
ウ:== 2
エ:!= 0
オ:!= 1
カ:!= 2
fに関する解答群
ア:== 0
イ:== 1
ウ:== 2
エ:!= 0
オ:!= 1
カ:!= 2模範解答
e:ア、f:ウ
解説
解答の導き方
この関数では、有線テレビ視聴料金とインターネット接続サービス利用料金を別々に計算し、最後に合計しています。空欄のある箇所は、インターネット接続サービス利用料金inet_feeを決める処理です。
まず、inet_planの値が何を表すかを確認します。問題文では、インターネット接続契約は「0:なし、1:低速回線、2:高速回線」です。したがって、最初の条件では契約なしを判定し、次の条件では低速回線を判定すればよいと分かります。
プログラムのinet_chargeは、料金を番号で取り出す配列(値を順番に並べて管理する仕組み)です。C言語では、配列の先頭を番号0で扱います。値と料金の対応は次のとおりです。
最初のifは、inet_planが0、つまり契約なしの場合です。このとき料金はinet_charge[0] なので、e1には0が入ります。
次のelse ifは、低速回線の場合です。inet_planが1のときにこの条件が成立するので、e2には1が入ります。したがって、eの組合せはアです。
次に、fを考えます。ここまでの条件に当てはまらない場合は、高速回線です。問題文でinet_planの値は0、1、2のいずれかとされており、0と1はすでに前の条件で分けられているためです。
高速回線の料金は、基本視聴契約がプラン2なら5,000円、それ以外なら6,000円です。basic_planは「0:なし、1:プラン1、2:プラン2」なので、5,000円にする条件はbasic_planが2と等しいことです。したがって、fには == 2が入り、解答群ではウです。
誤りやすいポイント
- e1とe2を逆にしないようにします。最初のifは契約なしの0、次のelse ifは低速回線の1を判定します。
- inet_chargeの番号は料金そのものではありません。たとえばinet_charge[1] は「低速回線の料金が1」という意味ではなく、配列の番号1にある料金2,500円を取り出すという意味です。
- 高速回線の料金は、基本視聴契約があるかないかだけでは決まりません。表2ではプラン2だけが5,000円で、プラン1と契約なしは6,000円です。そのため、basic_planが0でないかではなく、2と等しいかを判定します。
FAQ
Q: 低速回線では、なぜbasic_planが0かどうかを調べるのですか?
A: 表2では、基本視聴契約があればプラン1でもプラン2でも2,500円で、契約がなければ3,000円です。そのため、basic_planが0以外かどうかで料金を分けています。
A: 表2では、基本視聴契約があればプラン1でもプラン2でも2,500円で、契約がなければ3,000円です。そのため、basic_planが0以外かどうかで料金を分けています。
Q: 高速回線の分岐で、最後のelseに入るのはなぜですか?
A: inet_planの有効な値は0、1、2です。0は最初のif、1は次のelse ifで処理されるため、残る値2は高速回線です。
A: inet_planの有効な値は0、1、2です。0は最初のif、1は次のelse ifで処理されるため、残る値2は高速回線です。
Q: == と != は何を表しますか?
A: == は「等しい」、!= は「等しくない」という比較です。たとえばbasic_plan == 2は「basic_planが2であるか」を調べます。
A: == は「等しい」、!= は「等しくない」という比較です。たとえばbasic_plan == 2は「basic_planが2であるか」を調べます。
関連キーワード: 配列、添字、条件分岐、比較演算子



