C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でISBN番号(国際標準図書番号)を検証するプログラム


与えられた数字列が正しいISBN番号かどうかを判定するのが本記事のテーマです。C++による実装例とともに、ISBNの仕組みと検証アルゴリズムをわかりやすく解説します。

ISBN番号とは

ISBNとは「International Standard Book Number(国際標準図書番号)」の略称です。2006年12月までは10桁の番号体系でしたが、2007年1月1日以降は13桁へと改訂されました。ここでは、従来の10桁ISBNの検証方法について取り上げます。

ISBNの各桁には次のような役割があります。

  • 先頭の9桁: 書籍のタイトル・出版社・グループ(国や地域)を識別する情報を表します。各桁の値は0〜9の範囲です。
  • 最後の1桁(チェックディジット): ISBN全体が正しいかどうかを確認するための桁です。この桁が「10」となる場合には、記号「X」で表現されます。

10桁のISBNの検証手順

与えられた10桁の数字列が有効なISBNかどうかは、以下の手順で判定できます。

  • 先頭の桁から順に処理し、最初の桁には10を掛けます(ISBNが10桁であるため)。
  • 次の桁に進むごとに、乗数を1ずつ減らしていきます(10、9、8…)。
  • すべての積を合計します。
  • 合計値を11で割ります。
  • 剰余によって判定します。
    • 11で割り切れる(余りが0)場合 → 有効なISBN番号
    • 11で割り切れない(余りが0以外)場合 → 無効なISBN番号

入出力例

Input-: 002442142X
Output-: Not ISBN
Input-: 007462542X
Output-: it's ISBN

アルゴリズム

Start
Step 1-> ISBN判定用の関数を宣言
    bool isvalid(string &isbn_number)
        整数 n = isbn_number.length() を設定
            IF (n != 10)
                return false
            End
            整数 sum = 0 を設定
            For (int i = 0; i < 9; i++) のループ
                整数 value = isbn_number[i] - '0' を設定
                If (0 > value || 9 < value)
                    return false
                End
                sum += (value * (10 - i)) を設定
            End
            文字 last_val = isbn_number[9] を設定
            IF (last_val != 'X' && (last_val < '0' || last_val > '9'))
                return false
            End
            sum += ((last_val == 'X') ? 10 : (last_val - '0')) を設定
            return (sum % 11 == 0)
Step 2-> main() 内での処理
    文字列 isbn_number = "002442142X" を設定
    IF (isvalid(isbn_number))
        "is Valid" を出力
    Else
        "is invalid" を出力
    End
Stop

C++実装例

#include <bits/stdc++.h>
using namespace std;
// 有効なISBNかどうかを判定する関数
bool isvalid(string &isbn_number) {
    int n = isbn_number.length();
    if (n != 10)
        return false;
    int sum = 0;
    for (int i = 0; i < 9; i++) {
        int value = isbn_number[i] - '0';
        if (0 > value || 9 < value)
            return false;
        sum += (value * (10 - i));
    }
    char last_val = isbn_number[9];
    if (last_val != 'X' && (last_val < '0' || last_val > '9'))
        return false;
    sum += ((last_val == 'X') ? 10 : (last_val - '0'));
    return (sum % 11 == 0);
}
int main() {
    string isbn_number = "002442142X";
    if (isvalid(isbn_number))
        cout<<isbn_number<<" is Valid";
    else
        cout<<isbn_number<<" is invalid";
    return 0;
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

002442142X is invalid

このように、各桁に重みを掛けて合計し、その合計が11で割り切れるかどうかを確認するだけで、簡単にISBNの妥当性を検証できます。チェックディジット「X」への対応も忘れずに行うことがポイントです。

  1. C++でピラミッドの体積を計算するプログラムの作り方|底面の形状別の公式と実装例

    ピラミッドの底面の種類に応じた辺の長さが与えられたとき、そのピラミッドの体積を計算するのが本記事のテーマです。 ピラミッドとは、外側の面がすべて三角形で構成され、それらが共通の一点(頂点)で交わることで鋭い角を形成する3次元図形です。ピラミッドの体積は、底面がどのような形状であるかによって異なります。 ピラミッドの底面にはさまざまな種類があり、代表的なものは以下の通りです。 底面の形状別の体積の求め方 三角形の底面(三角錐) 底面が三角形の場合、ピラミッドの体積は次の公式で求められます。 体積 = (1/6) × a × b × h 正方形の底面(四角錐) 底面が正方形の場合、ピラミッドの体

  2. C++で学ぶクイックソート(QuickSort)の仕組みと実装方法

    クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率