この、番号は「間違い検出符号列」で構成されています。つまり、適当な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