読者です 読者をやめる 読者になる 読者になる

studies

いろいろ勉強用備忘録的な感じ

基本情報 平成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指定をして定数であることを示すべきだと思う。
これだけで、だいぶ読みやすくなる。
問題の都合上、というところもあるのでしょうが。