同じような計算を繰り返すだけのプログラムなので、硬貨の種類を配列に格納し、繰り返し文で計算させるようプログラムを改造する。
int kouka[4] = {500, 100, 50, 10};
末日の判定をif文で行っていたが、末日を配列に格納し、月の値によって直接得るようにプログラムを改造する。
int matubi[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; ※配列の0番目はダミーとし、プログラム内では使わない。
(1番目=1月 2番目=2月 ・・・と考える)
5×5の魔法陣を出力するプログラムを作成する。
【実行結果】
大きさ5の魔法陣 15 16 22 3 9 8 14 20 21 2 1 7 13 19 25 24 5 6 12 18 17 23 4 10 11【考え方】
<魔法陣とは>
n×nのマス目(nは奇数)に、縦、横、斜めのどの合計も等しくなるように、1,2,3,〜,(n×n)の整数を入れたもの。
<魔法陣の作り方>
- 作成する大きさの二次元配列を宣言し、すべての要素をゼロクリアする。
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 「1」を第0列の真ん中に入れる
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 「2」以降の整数を、次の手順で配列に格納していく。
- 最後に入れた位置から見て、
左上の位置を候補とする。 候補が欄外となる場合は、 図のように欄外にも魔法陣があるものと考え、 対応する位置を候補とする。
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 候補位置に何も入っていない(0が入ってる)ならば、その位置に整数を格納する。 すでに値が入っているなら、最後に入れた位置の右側に整数を格納する。
(候補位置にすでに値が入っている場合、最後に入れた位置の右側は必ず空いている)
0 0 0 3 0 0 0 0 0 2 1 0 0 0 0 0 5 6 0 0 0 0 4 0 0 - 魔法陣が全部埋まれば、配列の内容を出力する。