入れ子のif文をたどって賞金額の合計を求めるには
ITパスポート試験 令和7年度 問99 / アルゴリズムとプログラミング › アルゴリズムとプログラミング
過去問にチャレンジ
関数 calculateAmountOfPrize は、業務改善の効果における改善額と短縮期間を,それぞれ improvementと periodで受け取り、賞金額を戻り値とする。改善額が20万円で短縮期間が3日の業務改善と,改善額が5万円で短縮期間が14日の業務改善があった。この二つの賞金額の合計は何円か。ここで,改善額と短縮期間の値はそれぞれ0以上とする。 〔プログラム〕
○整数型: calculateAmountOfPrize(整数型: improvement, // 改善額(円)
整数型: period) // 短縮期間(日)
整数型: prize // 賞金額(円)
if (improvement が 100000 より小さい)
if (period が 7 より小さい)
prize ← 500
else
prize ← 1000
endif
else
if (period が 7 より小さい)
prize ← 2000
else
prize ← 5000
endif
endif
return prize
- ア
1,000
- イ
1,500
- ウ
3,000
- エ
5,500
会話形式の解説
講師今回は擬似言語のトレース問題です。プログラムを1行ずつ追って、変数の値がどう変わるかを確かめていく問題です。if文の中にもう一つif文がある「入れ子」の形になっているので、外側と内側でそれぞれ何を判定しているかを見てください。
受験者外側のifは改善額が100000より小さいかどうか、内側のifは短縮期間が7より小さいかどうか、ですね。条件が二つ重なっていると、どこから見ればよいのか迷ってしまいます。
講師外側の条件から順に判定します。外側でどちらに進むかが決まったら、進んだ側にある内側の条件だけを見れば十分です。組合せは4通りなので、先に表にしてみましょう。
受験者改善額が小さくて期間も小さいと500円、改善額が小さくて期間が7以上だと1,000円、改善額が100000以上で期間が小さいと2,000円、どちらも大きいと5,000円、という4通りですね。
講師そのとおりです。では、20万円・3日の案件はどこに入りますか。
受験者20万円は200000なので100000より小さくありません。外側はelse側に進みます。そこで期間3日を見ると7より小さいので、2,000円です。
講師正しいです。もう一つの5万円・14日の案件はどうでしょう。
受験者50000は100000より小さいので外側はif側です。期間14日は7より小さくないので内側のelse側に入り、1,000円です。合計は2,000+1,000で3,000円になります。
講師それが正解の3,000円です。ほかの選択肢がどんなミスで出てくる値かも確認しておきましょう。1,000円はどうですか。
受験者1,000円は5万円・14日の案件だけの金額です。20万円・3日の案件の2,000円を足し忘れた値ですね。
講師はい。1,500円は500+1,000です。20万円・3日の案件を「100000より小さい」側で計算して500円とし、5万円・14日の案件を1,000円とした場合の値です。20万円は100000より小さくないので、else側に進むのが正しい判定です。
受験者5,500円は5,000+500でしょうか。20万円・3日を5,000円、5万円・14日を500円としていて、期間の判定を逆にしてしまった値に見えます。
講師そう読めます。5,000円になるのは改善額が100000以上で、期間も7以上の場合だけです。3日は7より小さいので、20万円・3日の案件は2,000円になります。
受験者案件ごとに外側、内側の順で判定して戻り値を出し、最後に足す。この手順で進めれば取り違えにくいと分かりました。
講師もう一点、境界の値にも注意してください。「より小さい」は境界の値を含まないので、改善額がちょうど100000円の場合や、期間がちょうど7日の場合はelse側に進みます。誤りの選択肢は片方の案件だけを数えた値や、分岐を取り違えた値になっていることが多いので、4通りの表を先に書き出しておくと迷わずに済みます。
まとめ
改善額と短縮期間の組合せで賞金額を返す関数を、入れ子のif文をたどって読み解く問題です。外側のifで改善額が100000より小さいかどうか、内側のifで短縮期間が7より小さいかどうかを判定するので、賞金額は500円、1,000円、2,000円、5,000円の4通りになります。20万円・3日の案件は2,000円、5万円・14日の案件は1,000円で、合計は3,000円です。誤りの選択肢は、片方の案件の足し忘れや分岐の取り違えから出てくる値です。「より小さい」は境界の値を含まないので、ちょうど100000円や7日の場合はelse側に進むことも押さえておきましょう。
解答・解説
正解はウです
この問題のテーマ
入れ子になったif文をたどり、改善額と短縮期間の組合せで決まる賞金額を求める問題です。二つの業務改善それぞれの戻り値を出して合計します。
解き方の考え方
まず、外側のifが「改善額が100000より小さいか」、内側のifが「短縮期間が7より小さいか」を判定していることを確認します。次に、外側の条件から順に、それぞれの案件がどの分岐に入るかを追います。最後に二つの戻り値を足し、選択肢と照らし合わせます。計算は、20万円・3日の案件が2,000円、5万円・14日の案件が1,000円なので、2,000+1,000=3,000円です。正解のウと一致します。
選択肢ごとの解説
- ×ア 1,0001,000円は、5万円・14日の案件1件分の賞金額です。改善額は100000より小さく、期間は7以上なので1,000円になります。しかし、もう一方の20万円・3日の案件の2,000円が足されていません。
- ×イ 1,5001,500円は、20万円の案件を「100000より小さい」側の分岐で計算した場合の値です(500+1,000)。20万円は100000より小さくないのでelse側に進みます。500円になるのは改善額も期間も小さい場合で、本問の2件はどちらもこれに当たりません。
- ○ウ 3,00020万円・3日の案件は外側のelse側に進み、期間3は7より小さいので2,000円です。5万円・14日の案件は外側のif側に進み、期間14は7以上なので内側のelse側に入り1,000円です。合計は2,000+1,000=3,000円になります。
- ×エ 5,5005,500円は、5,000円の分岐を含む組合せの値です。しかし、20万円・3日の案件は期間が7より小さいので5,000円ではなく2,000円です。5,000円になるのは改善額が100000以上で、期間も7以上の場合だけです。
補足
トレース問題では、2行2列の表に4通りの賞金額を書き出してから各ケースを当てはめると、迷わずに済みます。誤りの選択肢は、片方の案件だけを数えたり、分岐を取り違えたりしたときの値になっていることが多いです。境界の値(100000や7)を入れた場合にどちらへ進むかも、あわせて確認しておくとよいでしょう。
POINT
- 入れ子のif文は外側の条件から順に判定し、進んだ側の内側の条件だけを見ます。
- この関数の賞金額は、改善額と短縮期間の大小の組合せで500円、1,000円、2,000円、5,000円の4通りに分かれます。
- 「より小さい」は境界の値を含まないので、ちょうど100000円や7日はelse側に進みます。
- 合計を問う問題では、各ケースの戻り値を個別に求めてから足すと、取り違えを防げます。
