基本情報 平成28年春 C言語 昨日の続き
おはよう。
天気が悪い。
気象庁によると、こんな感じなのだそうだ。
大雨と雷及び突風に関する全般気象情報 第2号
平成28年9月18日05時35分 気象庁予報部発表
(見出し)
西日本や東日本では18日夕方にかけて雷を伴った非常に激しい雨が降り、
大雨となる見込みです。土砂災害に厳重に警戒し、低い土地の浸水、河川の
増水やはん濫に警戒してください。落雷や竜巻などの激しい突風に注意して
ください。
(本文)
[気圧配置など]
前線が西日本から東日本にのびており、19日にかけて停滞する見込みで
す。山陰沖に前線上の低気圧があって、18日夜には日本の東海上に進むで
しょう。低気圧や前線に向かって南から暖かく湿った空気が流れ込むため、
西日本や東日本では、19日にかけて大気の状態が非常に不安定となる見込
みです。[防災事項]
<大雨>
西日本や東日本では、18日夕方にかけて雷を伴った非常に激しい雨が降
り、大雨となるでしょう。
19日6時までの24時間に予想される雨量は、いずれも多い所で、
九州北部地方、近畿地方 150ミリ
四国地方、北陸地方、東海地方 120ミリ
関東甲信地方 100ミリ
中国地方 80ミリ
です。土砂災害に厳重に警戒し、低い土地の浸水、河川の増水やはん濫に警戒し
てください。また、落雷や竜巻などの激しい突風に注意してください。発達した積乱雲
の近づく兆しがある場合には、建物内に移動するなど、安全確保に努めてく
ださい。[補足事項]
地元気象台の発表する警報や注意報、気象情報等に留意してください。
次の「大雨と雷及び突風に関する全般気象情報」は、18日17時ころに
発表する予定です。
さて、一夜明けてアルコールが抜けると、頭も少し回復する。
とりあえず、昨日私が書いたコードはアルゴリズムが全然間違っていることが分かった。
アルゴリズムは問題の通りで、全くよろしい。
再帰的な条件判定という技巧が分かりづらく、直せないものかと思ったけど、改めて考えるとわかりやすい気がする。
実行時動作が止まる(segmentation fault)する理由もわかった。
scanfで、&をつけ忘れていた。
再帰的な処理のところに問題があると思うじゃない…。
というわけで、ちゃんと動くソースコードはこちら。
#include <stdio.h> #define P_RN 2 #define P_CN 2 const int pat[P_RN][P_CN] = { {1, 1}, {1, 0} }; void print_frac(int); int exists_at(int, int, int); int main() { int d; printf("深さ? : "); scanf("%d", &d); print_frac(d); return 0; } void print_frac(int d) { int i, j, rn, cn; rn = cn = 1; for (i=0; i<d; i++) { rn *= P_RN; cn *= P_CN; } for (i=0; i<rn; i++) { for (j=0; j<cn; j++) { putchar(exists_at(i, j, d)? '*' : ' '); } putchar('\n'); } } int exists_at(int i, int j, int d) { if (!d) { return 1; } else if (!exists_at(i/P_RN, j/P_CN, d-1)) { return 0; } else { return pat[i%P_RN][j%P_CN]; } }
定数の取り扱いを修正している。
ソースコード全体を通じて値が変わらない変数は、#define か const指定をして定数であることを示すべきだと思う。
これだけで、だいぶ読みやすくなる。
問題の都合上、というところもあるのでしょうが。