当日の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\>