当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2012/05/25 sample-001.c */ #include <stdio.h> #include "s_turtle.h" /* * 亀プログラム * */ void move_ten(void) { /* 10 歩進む */ s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); } int main ( void ) { /* * 最初は真中 (0,0) で上をむいている */ move_ten(); /* 二十歩前に足跡を残しながら進む (0,20) に移動する事になる */ move_ten(); s_turtle_turn(); /* 時計回りに 45 度を二回、すなわち 90 度向きを変えるので右を向く */ s_turtle_turn(); move_ten();/* 二十歩前に足跡を残しながら進む (20,20) に移動する事になる */ move_ten(); s_turtle_turn(); /* 下を向く */ s_turtle_turn(); move_ten(); /* (20,0) に行く */ move_ten(); s_turtle_turn(); /* 左を向く */ s_turtle_turn(); move_ten(); /* 元の (0,0) に戻った */ move_ten(); return 0; }
C:\usr\c\>sample-001 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * 2012/05/25 sample-002.c */ #include <stdio.h> #include "s_turtle.h" /* * 亀プログラム * */ void jump_ten(void) { /* 10 歩跳ねる */ s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); s_turtle_jump(); } void move_ten(void) { /* 10 歩進む */ s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); s_turtle_move(); } void turn_90() { /* 90 度向きをかえる */ s_turtle_turn(); s_turtle_turn(); } void turn_270() { /* 270 度向きをかえる */ turn_90(); turn_90(); turn_90(); } void move_and_turn() { /* 20 歩進んで、向きを変える (四角形の辺を書く) */ move_ten(); move_ten(); turn_90(); } void draw_sqare() { /* 一辺が 20 歩の四角形を作る */ move_and_turn(); move_and_turn(); move_and_turn(); move_and_turn(); } int main ( void ) { /* * 最初は真中 (0,0) で上をむいている */ draw_sqare(); /* まず四角を書く */ turn_270(); /* 270 度回転 */ jump_ten(); /* 10 歩跳ねる */ draw_sqare(); /* また四角 */ turn_270(); jump_ten(); draw_sqare(); turn_270(); jump_ten(); draw_sqare(); return 0; }
C:\usr\c\>sample-002 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * 2012/05/25 sample-003.c */ #include <stdio.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* EOS を定義しておく (呪い) */ /* * 亀プログラム * */ /* * 引数で、回数を指定する */ void jump_n ( char *length ) { /* 文字の長さだけ跳ねる */ if ( *length == EOS ) { /* 「!strcmp ( length, "" )」でも良い */ /* length が空文字列 : 長さ 0 */ /* 何もする事はない / 命令はなにもかかなくてもよい */ } else { /* length は空文字ではない */ s_turtle_jump(); /* 取り敢えず「一歩」 */ jump_n ( length + 1 ); /* 「残り」は再帰で .. */ /* 文字列に +1 して長さを短くする所が重要 */ } } void move_n ( char *length ) { /* 文字の長さだけ跳ねる */ /* jump_n と基本的に同じ発想 */ if ( *length == EOS ) { /* 何もしなくてよい ( 0 歩進めって事だね.. ) */ } else { s_turtle_move(); move_n ( length + 1 ); } } void turn_n ( char *length ) { if ( *length == EOS ) { /* 何もしなくてよい ( 0 歩進めって事だね.. ) */ } else { s_turtle_turn(); turn_n ( length + 1 ); } } /* * 後は前と同じだが、記述が簡単になっている */ void jump_ten( void ) { /* 10 歩跳ねる */ jump_n ( "0123456789" ); /* 長さ 10 の文字列を指定する */ } void move_ten(void) { /* 10 歩進む */ move_n ( "0123456789" ); } void turn_90() { /* 90 度向きをかえる */ turn_n( "01" ); } void turn_270() { /* 270 度向きをかえる */ turn_90(); turn_90(); turn_90(); /* turn_n ( "012345" ) でも良いのだが.. */ } void move_and_turn() { /* 20 歩進んで、向きを変える (四角形の辺を書く) */ move_ten(); move_ten(); turn_90(); } void draw_sqare() { /* 一辺が 20 歩の四角形を作る */ move_and_turn(); move_and_turn(); move_and_turn(); move_and_turn(); } int main ( void ) { /* * 最初は真中 (0,0) で上をむいている */ draw_sqare(); /* まず四角を書く */ turn_270(); /* 270 度回転 */ jump_ten(); /* 10 歩跳ねる */ draw_sqare(); /* また四角 */ turn_270(); jump_ten(); draw_sqare(); turn_270(); jump_ten(); draw_sqare(); return 0; }
C:\usr\c\>sample-003 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * 2012/05/25 sample-004.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ void do_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } /* * 残りの処理 */ do_turtle ( program + 1 ); /* 再帰呼び出し */ } } /* * */ int main ( void ) { do_turtle ( "mmmmmmttmmmmmmttmmmmmmttmmmmmmtt" ); /* 四角をかく */ do_turtle ( "mmmmmmmmmmmmttmmmmmmmmmmmmttmmmmmmmmmmmmttmmmmmmmmmmmmtt" ); \ /* 四角をかく */ return 0; }
C:\usr\c\>sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * 2012/05/25 sample-005.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ /* * 文字列の先頭により何をするか考え、それだけを実行する */ void do_1_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } } /* * 文字列の先頭により何をするか考え、それを指定した長さだけ繰り返す */ void do_n_turtle ( char *program, char *length ) { if ( *length == EOS ) { /* なにもしない */ } else { do_1_turtle ( program ); /* とりあえず「一回」やる */ do_n_turtle ( program, length + 1 ); /* 「残り」をやる (再帰呼び出し) */ } } void do_turtle ( char *program ) { if ( *program == EOS ) { /* 空文字列なら */ /* なにもしない (終了) */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == '2' ) { /* 「数字」の処理 */ do_n_turtle ( program + 1, "**" ); /* 「次」を繰り返す */ do_turtle ( program + 2 ); /* 「残り(次の次)」をやる (再帰) */ } else if ( *program == '3' ) { do_n_turtle ( program + 1, "***" ); do_turtle ( program + 2 ); } else if ( *program == '4' ) { do_n_turtle ( program + 1, "****" ); do_turtle ( program + 2 ); } else if ( *program == '5' ) { do_n_turtle ( program + 1, "*****" ); do_turtle ( program + 2 ); } else if ( *program == '6' ) { do_n_turtle ( program + 1, "******" ); do_turtle ( program + 2 ); } else if ( *program == '7' ) { do_n_turtle ( program + 1, "*******" ); do_turtle ( program + 2 ); } else if ( *program == '8' ) { do_n_turtle ( program + 1, "********" ); do_turtle ( program + 2 ); } else if ( *program == '9' ) { do_n_turtle ( program + 1, "*********" ); do_turtle ( program + 2 ); } else { /* まだ、する事がある */ do_1_turtle ( program ); /* とりあえず「先頭」のみをやる */ do_turtle ( program + 1 ); /* 「残り」をやる (再帰) */ } } } /* * */ int main ( void ) { do_turtle ( "6m2t6m2t6m2t6m2t" ); /* 四角をかく */ do_turtle ( "6m6m2t6m6m2t6m6m2t6m6m2t" ); /* 四角をかく */ return 0; }
C:\usr\c\>sample-005 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * 2012/05/25 sample-006.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ /* * 文字列の先頭により何をするか考え、それだけを実行する */ void do_1_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } } /* * 文字列の先頭により何をするか考え、それを指定した長さだけ繰り返す */ void do_n_turtle ( char *program, char *length ) { if ( *length == EOS ) { /* なにもしない */ } else { do_1_turtle ( program ); /* とりあえず「一回」やる */ do_n_turtle ( program, length + 1 ); /* 「残り」をやる (再帰呼び出し) */ } } void do_turtle ( char *program ) { if ( *program == EOS ) { /* 空文字列なら */ /* なにもしない (終了) */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == '2' ) { /* 「数字」の処理 */ do_n_turtle ( program + 1, "**" ); /* 「次」を繰り返す */ do_turtle ( program + 2 ); /* 「残り(次の次)」をやる (再帰) */ } else if ( *program == '3' ) { do_n_turtle ( program + 1, "***" ); do_turtle ( program + 2 ); } else if ( *program == '4' ) { do_n_turtle ( program + 1, "****" ); do_turtle ( program + 2 ); } else if ( *program == '5' ) { do_n_turtle ( program + 1, "*****" ); do_turtle ( program + 2 ); } else if ( *program == '6' ) { do_n_turtle ( program + 1, "******" ); do_turtle ( program + 2 ); } else if ( *program == '7' ) { do_n_turtle ( program + 1, "*******" ); do_turtle ( program + 2 ); } else if ( *program == '8' ) { do_n_turtle ( program + 1, "********" ); do_turtle ( program + 2 ); } else if ( *program == '9' ) { do_n_turtle ( program + 1, "*********" ); do_turtle ( program + 2 ); } else { /* まだ、する事がある */ do_1_turtle ( program ); /* とりあえず「先頭」のみをやる */ do_turtle ( program + 1 ); /* 「残り」をやる (再帰) */ } } } /* * */ void triangl_n ( char *length ) { /* / */ do_turtle ( "t" ); do_n_turtle ( "m", length ); /* \ */ do_turtle ( "2t" ); do_n_turtle ( "m", length ); /* _ */ do_turtle ( "3t" ); do_n_turtle ( "m", length ); do_n_turtle ( "m", length ); /**/ do_turtle ( "2t" ); } /* * */ int main ( void ) { triangl_n ( "******" ); triangl_n ( "************" ); return 0; }
C:\usr\c\>sample-006 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * 2012/05/25 sample-007.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ /* * 文字列の先頭により何をするか考え、それだけを実行する */ void do_1_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } } /* * 文字列の先頭により何をするか考え、それを指定した長さだけ繰り返す */ void do_n_turtle ( char *program, char *length ) { if ( *length == EOS ) { /* なにもしない */ } else { do_1_turtle ( program ); /* とりあえず「一回」やる */ do_n_turtle ( program, length + 1 ); /* 「残り」をやる (再帰呼び出し) */ } } void do_turtle ( char *program ) { if ( *program == EOS ) { /* 空文字列なら */ /* なにもしない (終了) */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == '2' ) { /* 「数字」の処理 */ do_n_turtle ( program + 1, "**" ); /* 「次」を繰り返す */ do_turtle ( program + 2 ); /* 「残り(次の次)」をやる (再帰) */ } else if ( *program == '3' ) { do_n_turtle ( program + 1, "***" ); do_turtle ( program + 2 ); } else if ( *program == '4' ) { do_n_turtle ( program + 1, "****" ); do_turtle ( program + 2 ); } else if ( *program == '5' ) { do_n_turtle ( program + 1, "*****" ); do_turtle ( program + 2 ); } else if ( *program == '6' ) { do_n_turtle ( program + 1, "******" ); do_turtle ( program + 2 ); } else if ( *program == '7' ) { do_n_turtle ( program + 1, "*******" ); do_turtle ( program + 2 ); } else if ( *program == '8' ) { do_n_turtle ( program + 1, "********" ); do_turtle ( program + 2 ); } else if ( *program == '9' ) { do_n_turtle ( program + 1, "*********" ); do_turtle ( program + 2 ); } else { /* まだ、する事がある */ do_1_turtle ( program ); /* とりあえず「先頭」のみをやる */ do_turtle ( program + 1 ); /* 「残り」をやる (再帰) */ } } } /* * */ void triangl_n ( char *length ) { /* / */ do_turtle ( "t" ); do_n_turtle ( "m", length ); /* \ */ do_turtle ( "2t" ); do_n_turtle ( "m", length ); /* _ */ do_turtle ( "3t" ); do_n_turtle ( "m", length ); do_n_turtle ( "m", length ); /**/ do_turtle ( "2t" ); } /* * */ void pinwheel_sub ( char *length, char *times ) { if ( *times == EOS ) { } else { /* 羽の柄 */ do_n_turtle ( "m", "**" ); /* 羽の柄 */ triangl_n ( length ); /* 元の位置に戻る */ do_turtle ( "4t" ); do_n_turtle ( "j", "**" ); do_turtle ( "4t" ); /* 向きをかえる */ do_turtle ( "2t" ); pinwheel_sub ( length, times + 1 ); } } /* 風車 */ void pinwheel ( char *length ) { pinwheel_sub ( length, "****" ); /* 4 回羽をかけば.. */ } /* * */ int main ( void ) { pinwheel ( "********" ); return 0; }
C:\usr\c\>sample-007 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * 2012/05/25 sample-008.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ /* * 文字列の先頭により何をするか考え、それだけを実行する */ void do_1_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } } /* * 文字列の先頭により何をするか考え、それを指定した長さだけ繰り返す */ void do_n_turtle ( char *program, char *length ) { if ( *length == EOS ) { /* なにもしない */ } else { do_1_turtle ( program ); /* とりあえず「一回」やる */ do_n_turtle ( program, length + 1 ); /* 「残り」をやる (再帰呼び出し) */ } } void do_turtle ( char *program ) { if ( *program == EOS ) { /* 空文字列なら */ /* なにもしない (終了) */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == '2' ) { /* 「数字」の処理 */ do_n_turtle ( program + 1, "**" ); /* 「次」を繰り返す */ do_turtle ( program + 2 ); /* 「残り(次の次)」をやる (再帰) */ } else if ( *program == '3' ) { do_n_turtle ( program + 1, "***" ); do_turtle ( program + 2 ); } else if ( *program == '4' ) { do_n_turtle ( program + 1, "****" ); do_turtle ( program + 2 ); } else if ( *program == '5' ) { do_n_turtle ( program + 1, "*****" ); do_turtle ( program + 2 ); } else if ( *program == '6' ) { do_n_turtle ( program + 1, "******" ); do_turtle ( program + 2 ); } else if ( *program == '7' ) { do_n_turtle ( program + 1, "*******" ); do_turtle ( program + 2 ); } else if ( *program == '8' ) { do_n_turtle ( program + 1, "********" ); do_turtle ( program + 2 ); } else if ( *program == '9' ) { do_n_turtle ( program + 1, "*********" ); do_turtle ( program + 2 ); } else { /* まだ、する事がある */ do_1_turtle ( program ); /* とりあえず「先頭」のみをやる */ do_turtle ( program + 1 ); /* 「残り」をやる (再帰) */ } } } /* * do_n_m_turtle ( char *program, char *n, char *m ) * *program の先頭を n の長さと m の長さの積だけ繰り返す */ void do_n_m_turtle ( char *program, char *n, char *m ) { if ( *m == EOS ) { } else { do_n_turtle ( program, n ); do_n_m_turtle ( program, n, m + 1 ); } } /* * oct_sub ( char *length, char *times ) * 八角形の length の長さと同じ長さ辺を times の長さ回だけ表示する */ void oct_sub ( char *length, char *times ) { if ( *times == EOS ) { } else { do_n_m_turtle ( "m", length, "**" ); do_turtle ( "t" ); oct_sub ( length, times + 1 ); } } /* 八角形 */ void oct ( char *length ) { do_turtle ( "t" ); do_n_turtle ( "j", length ); do_turtle ( "7t" ); do_n_m_turtle ( "j", length, "**" ); do_turtle ( "3t" ); oct_sub ( length, "********" ); do_turtle ( "t" ); do_n_m_turtle ( "j", length, "**" ); do_turtle ( "t" ); do_n_turtle ( "j", length ); do_turtle ( "3t" ); } /* * */ int main ( void ) { oct ( "********" ); oct ( "****************" ); return 0; }
C:\usr\c\>sample-008 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * 2012/05/25 sample-009.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ /* * 文字列の先頭により何をするか考え、それだけを実行する */ void do_1_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } } /* * 文字列の先頭により何をするか考え、それを指定した長さだけ繰り返す */ void do_n_turtle ( char *program, char *length ) { if ( *length == EOS ) { /* なにもしない */ } else { do_1_turtle ( program ); /* とりあえず「一回」やる */ do_n_turtle ( program, length + 1 ); /* 「残り」をやる (再帰呼び出し) */ } } void do_turtle ( char *program ) { if ( *program == EOS ) { /* 空文字列なら */ /* なにもしない (終了) */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == '2' ) { /* 「数字」の処理 */ do_n_turtle ( program + 1, "**" ); /* 「次」を繰り返す */ do_turtle ( program + 2 ); /* 「残り(次の次)」をやる (再帰) */ } else if ( *program == '3' ) { do_n_turtle ( program + 1, "***" ); do_turtle ( program + 2 ); } else if ( *program == '4' ) { do_n_turtle ( program + 1, "****" ); do_turtle ( program + 2 ); } else if ( *program == '5' ) { do_n_turtle ( program + 1, "*****" ); do_turtle ( program + 2 ); } else if ( *program == '6' ) { do_n_turtle ( program + 1, "******" ); do_turtle ( program + 2 ); } else if ( *program == '7' ) { do_n_turtle ( program + 1, "*******" ); do_turtle ( program + 2 ); } else if ( *program == '8' ) { do_n_turtle ( program + 1, "********" ); do_turtle ( program + 2 ); } else if ( *program == '9' ) { do_n_turtle ( program + 1, "*********" ); do_turtle ( program + 2 ); } else { /* まだ、する事がある */ do_1_turtle ( program ); /* とりあえず「先頭」のみをやる */ do_turtle ( program + 1 ); /* 「残り」をやる (再帰) */ } } } /* * do_n_m_turtle ( char *program, char *n, char *m ) * *program の先頭を n の長さと m の長さの積だけ繰り返す */ void do_n_m_turtle ( char *program, char *n, char *m ) { if ( *m == EOS ) { } else { do_n_turtle ( program, n ); do_n_m_turtle ( program, n, m + 1 ); } } /* * do_2power_turtle ( char *program, char *power ) * program の先頭の命令を 2 の power の長さのべき乗回だけ実行する */ void do_2power_turtle ( char *program, char *power ) { if ( *power == EOS ) { /* 2^0 = 1 なので.. */ do_n_turtle ( program, "*" ); /* 1 回だけ行う */ } else { /* 2^{n+1} = 2 * 2^n = 2^n + 2^n */ do_2power_turtle ( program, power + 1 ); do_2power_turtle ( program, power + 1 ); } } /* * */ int main ( void ) { do_turtle ( "2t" ); do_2power_turtle ( "m", "****" ); do_turtle ( "2t" ); do_2power_turtle ( "m", "****" ); do_turtle ( "6t" ); do_2power_turtle ( "m", "***" ); do_turtle ( "6t" ); do_2power_turtle ( "m", "***" ); do_turtle ( "2t" ); do_2power_turtle ( "m", "**" ); do_turtle ( "2t" ); do_2power_turtle ( "m", "**" ); do_turtle ( "6t" ); do_2power_turtle ( "m", "*" ); do_turtle ( "6t" ); do_2power_turtle ( "m", "*" ); return 0; }
C:\usr\c\>sample-009 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * 2012/05/25 sample-010.c */ #include <stdio.h> #include <string.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* * 亀プログラム * */ /* * 文字列の先頭により何をするか考え、それだけを実行する */ void do_1_turtle ( char *program ) { if ( *program == EOS ) { /* なにもしない */ } else if ( *program == 'm' ) { /* move 命令 !! */ s_turtle_move(); } else if ( *program == 'j' ) { /* jump 命令 !! */ s_turtle_jump(); } else if ( *program == 't' ) { /* turn 命令 !! */ s_turtle_turn(); } else { /* その他 */ /* なんだかわからないので無視する */ } } /* * 文字列の先頭により何をするか考え、それを指定した長さだけ繰り返す */ void do_n_turtle ( char *program, char *length ) { if ( *length == EOS ) { /* なにもしない */ } else { do_1_turtle ( program ); /* とりあえず「一回」やる */ do_n_turtle ( program, length + 1 ); /* 「残り」をやる (再帰呼び出し) */ } } void do_turtle ( char *program ) { if ( *program == EOS ) { /* 空文字列なら */ /* なにもしない (終了) */ } else { /* * 一文字分の処理 : program の先頭の文字によって挙動をかえる */ if ( *program == '2' ) { /* 「数字」の処理 */ do_n_turtle ( program + 1, "**" ); /* 「次」を繰り返す */ do_turtle ( program + 2 ); /* 「残り(次の次)」をやる (再帰) */ } else if ( *program == '3' ) { do_n_turtle ( program + 1, "***" ); do_turtle ( program + 2 ); } else if ( *program == '4' ) { do_n_turtle ( program + 1, "****" ); do_turtle ( program + 2 ); } else if ( *program == '5' ) { do_n_turtle ( program + 1, "*****" ); do_turtle ( program + 2 ); } else if ( *program == '6' ) { do_n_turtle ( program + 1, "******" ); do_turtle ( program + 2 ); } else if ( *program == '7' ) { do_n_turtle ( program + 1, "*******" ); do_turtle ( program + 2 ); } else if ( *program == '8' ) { do_n_turtle ( program + 1, "********" ); do_turtle ( program + 2 ); } else if ( *program == '9' ) { do_n_turtle ( program + 1, "*********" ); do_turtle ( program + 2 ); } else { /* まだ、する事がある */ do_1_turtle ( program ); /* とりあえず「先頭」のみをやる */ do_turtle ( program + 1 ); /* 「残り」をやる (再帰) */ } } } /* * do_n_m_turtle ( char *program, char *n, char *m ) * *program の先頭を n の長さと m の長さの積だけ繰り返す */ void do_n_m_turtle ( char *program, char *n, char *m ) { if ( *m == EOS ) { } else { do_n_turtle ( program, n ); do_n_m_turtle ( program, n, m + 1 ); } } /* * do_2power_turtle ( char *program, char *power ) * program の先頭の命令を 2 の power の長さのべき乗回だけ実行する */ void do_2power_turtle ( char *program, char *power ) { if ( *power == EOS ) { /* 2^0 = 1 なので.. */ do_n_turtle ( program, "*" ); /* 1 回だけ行う */ } else { /* 2^{n+1} = 2 * 2^n = 2^n + 2^n */ do_2power_turtle ( program, power + 1 ); do_2power_turtle ( program, power + 1 ); } } /* * rec_figure ( char *length ) * length の長さだけの深さをもつ再帰的な図形 */ void rec_figure ( char *length ) { if ( *length == EOS ) { } else { do_2power_turtle ( "m", length ); do_turtle ( "2t" ); rec_figure ( length + 1 ); do_turtle ( "2t" ); rec_figure ( length + 1 ); do_turtle ( "2t" ); rec_figure ( length + 1 ); do_turtle ( "6t" ); do_2power_turtle ( "j", length ); do_turtle ( "4t" ); } } /* * */ int main ( void ) { do_turtle ( "4t" ); do_2power_turtle ( "j", "******" ); do_turtle ( "4t" ); rec_figure ( "******" ); return 0; }
C:\usr\c\>sample-010 C:\usr\c\>