この記事は記事は道メン(身内向け)アドベントカレンダーの12/24の記事です。
導入
最近、「これがわからないので教えてほしい」と言って質問を頂く機会が増えてきました。もちろん答えるのですが、私にとって前提であると思っていたものが欠落している場合があり、そこから教える必要がある例もありました。また、いきなりプログラムを書き始めるような方もおり困惑することもありました。
そこで、今回は私がプログラムを書くにあたってやっていることをそのまま書いていきます。
言語は、PHPとします。
テーマは、簡単に__「九九の結果を二次元配列で作成し、出力する。」__とします。
出力例は以下の通り
1 2 3 4 5 6 7 8 9
2 4 6 8
中略
72 81
まずやるべきこと
まずやるべきことは、「コードエディタを開いて、<?php
の文字とにらめっこすること」ではないです。
これは絶対に違います。
__これから書くプログラムの流れを言語化すること__が先です。
最終目標である、九九の表を画面表示させるために何が必要で、それを満たすうえでの条件は何かを見るべきです。
流れを言語化する
少々長くなりますが、今回は思考をそのまま書いてみることにします。
今回は説明のため、大まかに流れを考えた後にまとめを書きますが、普段はこれを一度にやっています。
多少雑になっている部分もありますが、本来ここはできるだけ細かく書くべきです。
- テーマにあるものを達成するためには、九九の結果を二次元配列に格納する部分と、表示させる部分の2つが必要
- ではまず、格納部について考えるべきである
- 出力例から推測するに、横をnの段として考えるのが良さそうだ。
- 二重ループを用いることで、同ギミックは作ることができそう。
-
iの段のj番目
の概念はそのまま配列の添え字を用いることができそう -
iの段のj番目
はi*j
で求めることができるが、iとjは、0から始めるか1から始めるかも考えておく必要がありそう - 0スタート、
i<9
で止まるようにすればいい具合になりそうだ。これはjに関しても同様。 - ただ、見た目で混乱する可能性がある(?)ので1スタート、
i<=9
で止めるのもアリかもしれない。(配列の添え字が1スタートなのは気持ちが悪いので不採用にしますがナシではないです。どっちがいいかは謎。 - 格納部のアルゴリズムに関してはこれで大まかには確定したので、次は表示部について考える。
- これもまた、二重ループを用いて表示することで解決ができそう。i,jに関して注意する点も格納時と一緒
つまり次のような流れで作業すればいいことになります
- 必要な配列の初期化(PHPなのでそこまで厳格にする必要もないが)。今回は
$table
とする - ここから格納部の作成
- 今回は二重ループを用いる
-
iの段のj番目
の概念はそのまま配列の添え字を用いる、ただし0の段0番目から8の段8番目という言い方になる点に注意が必要かもしれない。 -
$table[i][j]= (i + 1) * (j + 1);
としてしまうのがいいかもしれない。 - 格納部はここまで。次は表示部
- こちらはforeachを利用して取り出していく。
- 二重にforeachを利用する。先の格納部と同じ要領。一番上のforeachで
iの段
をすべて取り出す、これは配列の形である。 - 二回目のforeachでそれぞれの値を取り出す
これで最低限はできるはず。ここまで来て初めてコードとにらめっこが始まります。
#コードを書き始める
ここは正直もう先に流れを書いてしまったため、特に書くことはありません。
書き出した流れの中で、わからないことがあったら都度調べるくらいです。
流れを細かく書きだすことで、わからない場合に「何がわからないのか」を明確にすることができ、質問する場合でも回答者の負担が格段に減ります。
<?php
//九九の結果を二次元配列で作成し、出力する。
$table = array();
for ($i = 0; $i < 9; $i++) {
for ($j = 0; $j < 9; $j++) {
$table[$i][$j] = ($i + 1) * ($j + 1);
}
}
//foreachを利用して、二次元配列を出力する。
foreach ($table as $row) {
foreach ($row as $value) {
echo $value . " ";
}
echo "\n";
}
?>
ここまでで実行すると以下のように表示されるはずです。
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
最低限の表示はできました。
もちろんこだわるのであれば、まだ改善できる箇所があります。
例えば、
- 格納時の機構でi,jが0から始まっているため、直感的にわかりづらい点
- 出力時の機構で値が一桁の場合に位置がずれてきてしまう点
がすぐに挙げられるかと思います。今はあえて「どこの機構で」「どのような原因、条件で」「どのような問題が起こるか」を具体的に示しました。こうすれば、どこを見直すべきが後からでもわかるのではないでしょうか。
最後に
九九表示を極めるのがこのエントリの主題ではないのでこれくらいにしますが、いきなりコードを書き始めているわけではないことが伝わったならば幸いです。おしまい。