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」への対応も忘れずに行うことがポイントです。
-
C++でピラミッドの体積を計算するプログラムの作り方|底面の形状別の公式と実装例
ピラミッドの底面の種類に応じた辺の長さが与えられたとき、そのピラミッドの体積を計算するのが本記事のテーマです。 ピラミッドとは、外側の面がすべて三角形で構成され、それらが共通の一点(頂点)で交わることで鋭い角を形成する3次元図形です。ピラミッドの体積は、底面がどのような形状であるかによって異なります。 ピラミッドの底面にはさまざまな種類があり、代表的なものは以下の通りです。 底面の形状別の体積の求め方 三角形の底面(三角錐) 底面が三角形の場合、ピラミッドの体積は次の公式で求められます。 体積 = (1/6) × a × b × h 正方形の底面(四角錐) 底面が正方形の場合、ピラミッドの体
-
C++で学ぶクイックソート(QuickSort)の仕組みと実装方法
クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率