ISBNとは、書籍の裏表紙に書いてある10桁の登録番号です。
この、番号は「間違い検出符号列」で構成されています。つまり、適当な10桁の番号では不正な番号であることがわかってしまいます。
最初の桁を10倍します。次の桁は9倍します。その次は8倍します。これを9桁目まで繰り返します。最後の桁はそのままです。最後の桁がアルファベットのXであることがあります。この場合は10とします。これらを合計した数が11の倍数であれば、正しいISBNということになります。つまり、最後の桁で11の倍数になるように調整しているわけです。
11の倍数になるためには、最後に10をたさなくてはならない場合もでてきます。それでその場合はXにするわけです。
これは、C言語編第8章でも取り扱っています。
これは、今までの知識のみで作ることができます。
さっそく、作ってみましょう。
// isbn01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class isbn01 : Form
{
// テキストボックスがこのクラスのみんなから見えるように
// フィールドにしてある
TextBox tb;
public static void Main()
{
Application.Run(new isbn01());
}
// コンストラクタ
public isbn01()
{
Text = "猫でもわかるC#";
BackColor = SystemColors.Window;
FormBorderStyle = FormBorderStyle.FixedSingle;
MaximizeBox = false;
MinimizeBox = false;
tb = new TextBox();
tb.Parent = this;
tb.Location = new Point(10, 10);
tb.Width = 150;
Button btn = new Button();
btn.Parent = this;
btn.BackColor = SystemColors.Control;
btn.Text = "チェック";
btn.Click += new EventHandler(btn_Click);
btn.Location = new Point(20 + tb.Width, 10);
// 親フォームの大きさを調整するための計算
Size sz = new Size();
sz.Width = 30 + tb.Width + btn.Width;
sz.Height = 20 + tb.Height;
// 親フォームのクライアント領域サイズの調整
tb.Parent.ClientSize = sz;
}
void btn_Click(object sender, EventArgs e)
{
string strTitle = "ISBN検査結果";
// nISBNを0に戻しておく
int nISBN = 0;
// 入力桁数が10桁でないときはエラー
if (tb.Text.Length != 10)
{
MessageBox.Show("桁が変です",
strTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Stop);
tb.Clear();
tb.Focus();
return;
}
// nISBNを9桁目まで計算
for (int i = 0; i < 9; i++)
{
try
{
nISBN += Int32.Parse(tb.Text[i].ToString()) * (10 - i);
}
catch
{
MessageBox.Show("不正な文字が含まれています",
strTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Stop);
tb.Clear();
tb.Focus();
return;
}
}
// 最後の桁がXまたはxの時は10を加える
if (tb.Text[9] == 'X' || tb.Text[9] == 'x')
nISBN += 10;
else
{
try
{
nISBN += Int32.Parse(tb.Text[9].ToString());
}
catch
{
MessageBox.Show("最後の文字が数字ではありません",
strTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Stop);
tb.Clear();
tb.Focus();
return;
}
}
if (nISBN % 11 == 0)
MessageBox.Show("正しいISBNです",
strTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
else
MessageBox.Show("不正なISBNです",
strTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Stop);
}
}
ボタンが、押されたときにテキストボックスから、文字列を読み出して正しいISBNかどうかをチェックしています。桁が10桁でないときは、直ちにエラーにしています。
nISBN += Int32.Parse(tb.Text[i].ToString()) * (10 - i);でiを0から9まで変化させ、合計をnISBNに代入しています。
Int32.Parse(Strring型);のような変換はコンソール編第4章、第13章などで出てきていますので、忘れてしまった人は見ておいてください。
また、try-catch構文については、コンソール編第65章を参照してください。
最後の桁が「X」または「x」なら、nISBNに10を加えます。
nISBNが11の倍数かどうかは、nISBNを11で割ってあまりが0かどうかを調べるとよいですね。
では、実行結果を見てみましょう。
テキストボックスに、ISBNを入力して、「チェック」ボタンを押します。
このISBNは正しい番号のようです。
Update 14/Nov/2006 By Y.Kumei