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