第37問 バーコードのチェックディジット
商品のバーコードの末尾にある「チェックディジット」は、読みまちがいを見つけるための1桁の数字です。7桁の番号を1桁ずつ入れた配列 code(=[4,9,1,2,3,4,7])があり、左から code[0], code[1], … , code[6] の7個です。下の桁(一の位)を1番目として、奇数番目の数字を3倍、偶数番目の数字を1倍し、合計 gokei を出します。その合計の下1桁 amari を10からひいたものがチェックディジットです。ただし、下1桁が0となった場合は、チェックディジットは0となります(3か所の穴をうめよう)
難易度:★★★★★(5/難しい)。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
code = [4,9,1,2,3,4,7]
gokei = 0
i を 1 から 7 まで 1 ずつ増やしながら繰り返す:
banme = 7 [A] i
keta = code[banme]
もし i % 2 == 1 ならば:
omomi = 3
そうでなければ:
omomi = 1
gokei = gokei + keta [B] omomi
amari = gokei % 10
もし amari == [C] ならば:
check = 0
そうでなければ:
check = 10 - amari
表示する("チェックディジットは" + check + "です")
空欄 [A]・[B]・[C] に当てはまるものを、次の選択肢から選びます。
選択肢
ヒント
配列の番号は code[0] から始まるので、下から i 番目は code[7 - i] です(i = 1 なら右はしの code[6] = 7)。重みは keta * omomi でかけます。この番号は gokei = 60 なので下1桁は0。10 - 0 = 10 は2桁になってしまうので、下1桁が0となった場合はチェックディジットを0とします。答えは0です
解答
- 空欄 [A] …
-
- 空欄 [B] …
*
- 空欄 [C] …
0
よくある間違い
- [A]
+ [B]* [C]0 … 1つ目は「下から i 番目は配列の何番目か」を決めるところです。7 + i だと i = 1 のとき code[8] になり、7個しかない配列にその番号はありません。下から1番目は右はしの code[6] なので 7 - i とします
- [A]
* [B]* [C]0 … 7 * i だと i = 1 のとき code[7] になり、配列の外を見てしまいます。番号は code[0] から code[6] までなので、7 - i で右はしからさかのぼります
- [A]
/ [B]* [C]0 … 7 / i だと i = 3 のとき 2.33… と小数になり、配列の番号になりません。1ずつ左へずらしたいので、ひき算の 7 - i を使います
- [A]
% [B]* [C]0 … % はあまりです。7 % i だと i = 1 で0、i = 2 で1 とバラバラな番号になり、右から順に見ていけません。i が1ふえるごとに番号が1へるように 7 - i とします
- [A]
- [B]+ [C]0 … 重み omomi は「かける」ものです。keta + omomi だと 7 + 3 = 10 となり、3倍したことになりません。keta * omomi で 7 * 3 = 21 とします
- [A]
- [B]/ [C]0 … わり算では 7 / 3 = 2.33… と小数になり、3倍の重みになりません。「3倍」はかけ算なので * を使います
- [A]
- [B]% [C]0 … % はあまりです。keta % omomi だと 7 % 3 = 1 となり、重みをかけたことになりません。3倍するのは * です
- [A]
- [B]* [C]1 … 下1桁が1のときは 10 - 1 = 9 で、ちゃんと1桁におさまります。特別あつかいがいるのは、10 - amari が2桁の10になってしまうとき、つまり下1桁が0のときです
- [A]
- [B]* [C]10 … amari は合計の下1桁なので0〜9にしかならず、10 になることはありません。これでは一度も使われない分岐です。2桁になってしまうのは下1桁が0のときなので、amari == 0 とします
ほかの問題