Powered by SmartDoc

ソフトウェア概論A (2012/05/25)
Ver. 1.2

2012年5月25日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2012/soft/soft.html
ソフトウェア概論 A2012年5月25日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加資料

講義で利用するサンプルプログラム

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 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;
}
sample-001.c の実行結果
C:\usr\c\>sample-001
C:\usr\c\> 
表示結果

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 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;
}
sample-002.c の実行結果
C:\usr\c\>sample-002
C:\usr\c\> 
表示結果

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 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;
}
sample-003.c の実行結果
C:\usr\c\>sample-003
C:\usr\c\> 
表示結果

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 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;
}
sample-004.c の実行結果
C:\usr\c\>sample-004
C:\usr\c\> 
表示結果

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 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;
}
sample-005.c の実行結果
C:\usr\c\>sample-005
C:\usr\c\> 
表示結果

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 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;
}
sample-006.c の実行結果
C:\usr\c\>sample-006
C:\usr\c\> 
表示結果

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 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;
}
sample-007.c の実行結果
C:\usr\c\>sample-007
C:\usr\c\> 
表示結果

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 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;
}
sample-008.c の実行結果
C:\usr\c\>sample-008
C:\usr\c\> 
表示結果

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 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;
}
sample-009.c の実行結果
C:\usr\c\>sample-009
C:\usr\c\> 
表示結果

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 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;
}
sample-010.c の実行結果
C:\usr\c\>sample-010
C:\usr\c\> 
表示結果

講義中に作成したサンプルプログラム

Links

関連 Link

C 言語標準ライブラリ

OpenGL