基本情報技術者 2012年 春期 午前(科目A) 問57
問題文
チェックディジットを利用する目的として、適切なものはどれか。
選択肢
ア:数値項目へ入力したデータに、英字や記号が混入した誤りを検出する。
イ:入力したコードの値の誤りを検出する。(正解)
ウ:入力したコードの桁数の誤りを検出する。
エ:入力したデータ値が、定められた範囲内に収まっていない誤りを検出する。
🔒 解説は解答すると表示されます
チェックディジット【午前解説】
正解の理由
正解は イ:入力したコードの値の誤りを検出する。
チェックディジットはコード本体の数値列に基づいて生成される検査値で、後で同じ計算を行い一致しない場合に誤入力を検出します。これにより、打ち間違いや桁ごとの誤置換、(アルゴリズムによっては)隣接桁の入れ替えなどを検出できます。したがって「入力したコードの値の誤りを検出する」が目的に最も合致します。
チェックディジットはコード本体の数値列に基づいて生成される検査値で、後で同じ計算を行い一致しない場合に誤入力を検出します。これにより、打ち間違いや桁ごとの誤置換、(アルゴリズムによっては)隣接桁の入れ替えなどを検出できます。したがって「入力したコードの値の誤りを検出する」が目的に最も合致します。
解法ステップ
- 問題文の「チェックディジット」の定義を思い出す:追加された検査用の桁であることを確認。
- 各選択肢が「どの種の誤りを検出するか」を整理する(英字混入・コード値・桁数・範囲)。
- チェックディジットの目的は「コード値の整合性確認」であると判断して選択肢を絞る。
- 余剰な検証(文字種や範囲、桁数専用)とは異なる点を理由として正答を確定する。
選択肢別の誤答解説
- ア: 数値項目へ入力したデータに、英字や記号が混入した誤りを検出する。
→ 誤り。英字や記号の混入はデータ型やフォーマット検証(入力チェック)で検出するのが基本で、チェックディジットは文字種の検査が目的ではありません。 - イ: 入力したコードの値の誤りを検出する。
→ 正解。チェックディジットはコード本体の数値列との整合性を確認し、誤入力を検出するために用いられます。 - ウ: 入力したコードの桁数の誤りを検出する。
→ 誤りに近いが不正確。固定長の仕様チェックで桁数違いは検出しますが、チェックディジット自体は値整合性の検査であり、桁数専用の機能ではありません。 - エ: 入力したデータ値が、定められた範囲内に収まっていない誤りを検出する。
→ 誤り。範囲チェックは業務ルールやバリデーション(min/max)で行い、チェックディジットは範囲検査用ではありません。
よくある誤解
- チェックディジットで英字や記号の混入を自動的に検出できると思う誤解:文字種の検証は別途パーサや正規表現で行う必要があります。
- 桁数エラーを完全に検出できると思う誤解:固定長の規約がある場合は桁数違いを検出できますが、チェックディジット自体は主に値の整合性確認であり桁数チェック専用ではありません。
- すべての誤りを検出できると考える誤解:チェックディジットの検出能力はアルゴリズムに依存し、すべてのタイプの誤り(複数桁の特定パターンの誤り等)を捕らえられるわけではありません。
補足コラム
- よく使われるアルゴリズム例:
- Luhn(ルーン)アルゴリズム:クレジットカード番号などで使われる、ベースの手法。特定の桁を倍にして桁和を取る。
- Mod 11(ISBN-10等):重み付けして和を取り、で検査する。
- 検出できる誤りの例:単一桁の誤り(大半の方式で検出)、隣接桁の入れ替え(一部アルゴリズムで検出)。
- 検出できない/見逃しやすい誤り:複数桁が同時に特定の関係で誤っている場合や、アルゴリズムの性質上検出不能な特定パターン。
例:Luhnアルゴリズム(簡易 Python 実装)
def luhn_check(number_str):
digits = [int(d) for d in number_str[::-1]]
total = 0
for i, d in enumerate(digits):
if i % 2 == 1:
d *= 2
if d > 9:
d -= 9
total += d
return total % 10 == 0
FAQ
Q: チェックディジットは桁数が違うだけでも検出しますか?
A: 固定長であればシステム側の桁数検証で弾けますが、チェックディジット自体は桁数違い専用ではありません。結果として不一致になれば検出されることもありますが、保証はアルゴリズムや実装次第です。
A: 固定長であればシステム側の桁数検証で弾けますが、チェックディジット自体は桁数違い専用ではありません。結果として不一致になれば検出されることもありますが、保証はアルゴリズムや実装次第です。
Q: 英字や記号の混入はチェックディジットでカバーできますか?
A: いいえ。文字種チェックは入力バリデーションで行い、チェックディジットは数値列の整合性を主に見る仕組みです。
A: いいえ。文字種チェックは入力バリデーションで行い、チェックディジットは数値列の整合性を主に見る仕組みです。
Q: どのアルゴリズムが最も検出力が高いですか?
A: 検出力はアルゴリズムによって異なり、単一誤りや隣接入れ替えの検出に強いものもあればそうでないものもあります。用途に応じて選択します(例:金融はLuhn、図書はMod11等)。
A: 検出力はアルゴリズムによって異なり、単一誤りや隣接入れ替えの検出に強いものもあればそうでないものもあります。用途に応じて選択します(例:金融はLuhn、図書はMod11等)。
関連キーワード: チェックディジット、誤り検出、Luhn、Mod11、ISBN、データ検証、入力バリデーション、エラーチェック

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

