42でできた友人

42Tokyoに入ってすぐに、プログラミングに非常に秀でた友人ができた。
その彼に学習のコツを尋ねたところ、とにかく「解きながら学ぶC言語(柴田望洋、他:著)」を、ヒントを見ずに全て解けるようにしろとのことだった。
この本の内容を端的に言うと、「ページに示された出力画面を再現するようにプログラムを作る」というものだ。
つまり、書いてある内容を覚えるというより、謎解きをする感じだ。

例えば、「整数値15と37の和を計算して、その値である52を表示するプログラムを書け」いう問題があったとする。
最初はprintfを使って書いてみて上手く動いたなら、次にいくつかの自作関数に分けてみる、といった具合に自力での「推敲」をしていく。

この、いじくり回すプロセスがとても大事なのだ。

以下に1例を示す。



// 48:57 = 0:9, 65:90 = A:Z, 97:122 = a:z
 #include  <libc.h>

int				calc_add(int num1, int num2)
{
    int			ans;

    ans = num1 + num2;
    return (ans);
}

void			num_to_char(int ans)
{
    int			sho;
    int			keta;
    int			num;
    int			cpnum;
    double	    warukazu;
    char		word[32];
    int			i;

    keta = 0;
    num = ans;
    sho = num;
    cpnum = num;
    warukazu = 0.1;
    i = 0;
    while (cpnum > 0)
    {
	    cpnum = cpnum / 10;
	    i++;
	    keta++;
	    warukazu = warukazu * 10; 
	    //printf("keta = %d\nwarukazu = %f\n", keta, warukazu);
    }
    cpnum = num;
    i = 0;
    while (keta > 0)
    {
	    word[i] = cpnum / warukazu + '0';
	    write(1, &word[i], 1);
	    cpnum = cpnum - warukazu * (word[i] - '0');
	    warukazu = warukazu / 10;
	    keta--;
	    i++;
    }
    return ;
}

int				main(void)
{
    int			a;
    int			b;
    int			ans;

    a = 15;
    b = 37;
    ans = (calc_add(a, b));
    num_to_char(ans);
    return (0);
}

こうしてみると、ただの足し算だと思っていたものが、かなりどんどん深掘りできることに気が付く。
その深淵の入り口が見える。

この記事が気に入ったらサポートをしてみませんか?