第30章 C#版ISBNチェッカーを作ってみる


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は正しい番号のようです。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 14/Nov/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。