studies

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

基本情報 平成28年春 C言語

十六夜の月というビールを飲んでいた。

風雅な名前にたがわず、とても美味しい。



ほろ酔いで、この問題を解いていた。

基本情報技術者過去問題 平成28年春期 午後問9|基本情報技術者試験.com




ジュリア集合とか高木関数とか、興味深いフラクタル図形を、ちょっと書いてみましょう、という問題。

もちろん、ジュリア集合とかを書くわけではなく、パターンを与えて、深さdの図形を描くだけである(ほんとうのフラクタルとは、コッホ曲線のように、d→∞としたものである)。



とりあえず問題には正解した。

でもソースコードに不満がある。

お世辞にもわかりやすいコード、安全なコードとは言えない(と思う)。



なので、書き直していた。

コンパイルは通るけど、なぜか止まる。

なぜだ。

今日はもう疲れた(酔ってるだけだが)ので、明日考えることにする。



ちなみに書き直したコードは、以下の通り。

何か気づいた人がいたら教えてください。


#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==0) {
        return 1;
    } else if(d==1) {
        return pat[i][j];
    } else {
        return exists_at(i/P_RN, j/P_CN, d-1);
    }
}