<< 2024 年 12 月 >>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4


 トップ > プログラミング > Sudoku  ナンバープレイスを課題にしたプログラム作りです。

 1 2 3 4 5 6 7 8 9 10 11 12 13 
2010/08/07 14:45
3. 数独解法手順1の記述

先に記した解法の手順を、プログラム言語を使った記述に書き換えます。プログラム言語は、手順を記述するために特化した言語体系を持ちます。曖昧さが排除され、より厳密に手順を記述することが可能になります。プログラム言語で記したスクリプト(ソースコード)をPCに実行させることで、手順の正しさを検証できます。実行結果を確認しながら、段階的にプログラムを作っていくことにしましょう。

数あるプログラム言語の中から、PHP を使うことにします。私自身が最近よく使っていることと、コマンドプロンプトからスクリプトを簡単に実行させることができるからです。コマンドプロンプトについては、こちらを参考にしてください。

PHP は、ソースコード中の '<?php' と '?>' の間に書かれたコードを解釈して実行します。'<?php' と '?>' の間にないコードはそのまま表示されます。テキストエディタで新規にコードを書くとき、まず '<?php' と '?>' を二行書き、その間にスクリプトを書いていくのが、私の流儀です。こうすることで、他の言語と同様に扱えるからです。'//' は、行内のそれ以降の部分が注釈となります。また、'/*' から '*/' に挟まれる部分は行を跨いでも注釈となります。

この部分はそのまま表示されます。
<?php
// この部分にスクリプトを書きます。
?>

さて、手順1を PHP で記述してみましょう。手順1は、「各マス目に入る数字として、1から9までが候補となる」でした。マス目は全部で81個あります。手順を進めるにつれ、各マス目の候補が個別に絞り込まれまるので、81個のマス目の候補データを個別に扱う必要があります。

プログラムが扱うデータは記憶域に格納されますが、必要に応じて参照したり、書き換えたりするので、記憶域には名前を付けておきます。プログラムを読みやすくするために、どのようなデータが格納されているのか分かるような名前を付けます。PHP では、記憶域の名前の先頭に'$'を付け、変数と呼んでいます。記憶域に12を格納する記述は、'$var_name = 12;'となります。'='は、等式を表しているのではなく、データの格納を意味しています。文字列を格納する場合は、文字列を引用符で囲みます。

<?php
$n = 12; // $n の n は、number の頭文字。
$n = '12345'; // 名前から数値を期待するが、文字列も格納できる。
?>

9×9 のマス目を個別に扱うために、81個の変数を扱うのは面倒です。配列を使うことで、扱いが楽になります。一つの変数名でも、添字が違えば、記憶域が別になります。'$ar = array();' と書くことで、$ar は配列として定義されます。'$ar[1] = 12; $ar[5] = 34;' というように使います。


やさしいコンピュータ科学 (Ascii books)
数独パズルを解く。
<?php
// 数独パズルを解く。
// 9x9のマス目に候補値を設定する。
$grid = array();
for($n = 0; $n < 81; $n++)
{
    $grid[$n] = '123456789';
}
?>

for(式1; 式2; 式3)は制御構造の一つで、{}の中の処理を条件に基づいて繰り返すために使います。最初に式1が実行されます。次に式2が評価されます。結果が TRUE なら{}の中の処理を実行し、式3を実行します。以降、式2の評価に戻って処理を繰り返します。式2の評価が FALSE なら、繰り返し処理は終わりです。上のコードは、$grid[0]、$grid[1]、…$grid[80]と81個のマス目に、候補値'123456789'を設定しています。'$n++'は、'$n = $n + 1'と同義です。


(Sudoku) 2010/08/07 14:45

名前:
コメント:
投稿キー: ※右の文字列を入力してください。