Download : sample-001.c
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 再帰呼出しを利用した繰返し
 */
#include <stdio.h>
#include <string.h>
/*
 * print_hello : 「Hello, World」の出力 (繰り返したい内容)
 */
void print_hello ( void ) {
	 printf ( "Hello, World\n" );
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	"Hello, World\n" を繰り返す場合
 */
void loop_print_hello ( char *times ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_hello();					/* 繰り返したい内容 */
		loop_print_hello ( times + 1 );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	printf ( "*** : 三回\n" );
	loop_print_hello ( "***" );	/* 三回繰り返す */
	printf ( "***** : 五回\n" );
	loop_print_hello ( "*****" );	/* 五回繰り返す */
	return 0;
}
$ ./sample-001.exe *** : 三回 Hello, World Hello, World Hello, World ***** : 五回 Hello, World Hello, World Hello, World Hello, World Hello, World $
/*
 * 20180525-01-QQQQ.c
 *
 *	漢字の「回」という文字(にみえる..) 絵を Turtle Graphics で書きなさい
 */
#include <stdio.h>
#include "s_turtle.h"
/*
 * sub
 */
void jump_ten(void) {	/* 10 歩跳ねる */
  s_turtle_jump();	/* 10 回命令を書いている => 繰り返しを使いたいところ .. */
  s_turtle_jump();	/* 今向いている方向に、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();	/* 向いている方向に 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();
}
void turn_90() {	/* 90 度向きをかえる */
  s_turtle_turn();	/* 一度 turn すると、 45 度なので、二回で 90 度 */
  s_turtle_turn();
}
void small_square() {	/* 内側の四角を作る */
						/*	=> 一辺が長さ 10 歩の正方形にする */
  move_ten();			/* 一つの辺 */
  turn_90();			/* 直角に曲がる */
						/* 	正方形なので、四辺書けばよい */
  move_ten();			/* 一つの辺 */
  turn_90();			/* 直角に曲がる */
  move_ten();			/* 一つの辺 */
  turn_90();			/* 直角に曲がる */
  move_ten();			/* 一つの辺 */
  turn_90();			/* 直角に曲がる */
						/* 最後の turn は不要だが、こうすると、元と同じ向きになる */
						/*		最初に上を向いていれば、書き終わった後も上を向いている */
						/*		同時に、実は、元の位置に戻っている */
						/* 何かをするときには、後始末
							(目的のもの以外のもの[の変化を『副作用』と呼ぶ]は元に戻す)が
							マナー (副作用はできるだけ起きないようする) */
}
void big_square() {
						/*	=> 一辺が長さ 30 歩の正方形にする */
  move_ten();
  move_ten();
  move_ten();
  turn_90();
  move_ten();
  move_ten();
  move_ten();
  turn_90();
  move_ten();
  move_ten();
  move_ten();
  turn_90();
  move_ten();
  move_ten();
  move_ten();
  turn_90();
}
int main ( void ) {
  small_square();	/* 小さい四角 */
	/* 大きな四角を書くために、描画の準備をする必要がある */
	/*		=> 場所の移動と、向きを適切にするにする */
	/*	[目的]
			左下に 10 歩の場所に移動
			上向きになる
	*/
	/*
			移動するためには、そちらを向いている必要があるので、
				そっちに向く
					5 回、向きを変える
			移動する ( 10 歩 )
					(足跡を残したくないので..) jump_ten()
			移動した先で、上を向くようにする
					3 回、向きを変える
	*/
  big_square();		/* 大きい四角 */
  putchar ( '>' );
  getchar();
  s_turtle_stop();
  return 0;
}
#include <stdio.h>
void infinity_loop() {		/* 	無限回繰り返す */
	printf ( "Hello, World\n" );	/* 画面に「Hello, World」を出力 */
	infinity_loop();			/* 「無条件」に「再帰呼び出し」 */
								/*		=> 「無限ループ」になる */
}
int main(void) {
	infinity_loop();		/* 「無限回繰り返す」関数を呼び出す */
		/*
			=>
				printf ( "Hello, World\n" );
				infinity_loop();
			=>
				printf ( "Hello, World\n" );
					printf ( "Hello, World\n" );
					infinity_loop();
			=>
				printf ( "Hello, World\n" );
					printf ( "Hello, World\n" );
						printf ( "Hello, World\n" );
						infinity_loop();
			=>
				....
			=>
				printf ( "Hello, World\n" );
				....
				printf ( "Hello, World\n" );
				infinity_loop();
		*/
	return 0;
}
/*
	このプログラムを実行すると、無限に実行して、止まらなくなる
		=> プログラムを止めるには、 Ctrl-C ( [Ctrl] キーを押しながら [c] キーをポンと押す ) する
で
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times, char *message ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_any( message );			/* 繰り返したい内容 */
		loop_print_any ( times + 1, message );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	printf ( "*** : 三回\n" );
	loop_print_any ( "***", "Hello, World\n" );	/* 「Hello, World\n」を三回繰り返す */
	printf ( "***** : 五回\n" );
	loop_print_any ( "*****", "おめでとう\n" );	/* 「おめでとう」を五回繰り返す */
	return 0;
}
/*
	再帰的定義を行う関数に、補助的な引数を渡して、
		繰り返したい内容の所で利用する事により、
			繰り返したい内容を自由に変更する事ができる
		! 繰り返したいものに引数が n 個なら、繰り返しを行う関数は n+1 の引数になる
*/
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times, char *message ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_any( message );			/* 繰り返したい内容 */
		loop_print_any ( times + 1, message );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
void loop_loop_print_any( char *times2, char *times, char *message ) {
	if ( !strcmp ( times2, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		loop_print_any( times, message );			/* 繰り返したい内容 */
		loop_loop_print_any ( times2 + 1, times, message );	/* 再帰を利用して残りを行う */
						 		 	 	/* times2 + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	loop_loop_print_any ( "*****", "***","Hello, World\n" );
	/*
		=>
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		=>
			print_any( "Hello, World\n" );
			print_any( "Hello, World\n" );
			print_any( "Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		loop_print_any ( "***","Hello, World\n" );
		=>
			print_any( "Hello, World\n" );	が 3 x 5 = 15 回呼ばれる
	*/
	return 0;
}
/*
	再帰的定義を行う関数に、補助的な引数を渡して、
		繰り返したい内容の所で利用する事により、
			繰り返したい内容を自由に変更する事ができる
		! 繰り返したいものに引数が n 個なら、繰り返しを行う関数は n+1 の引数になる
*/
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times, char *message ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_any( message );			/* 繰り返したい内容 */
		loop_print_any ( times + 1, message );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
void loop_loop_print_any( char *times2, char *times, char *message ) {
	if ( !strcmp ( times2, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		loop_print_any( times, message );			/* 繰り返したい内容 */
		loop_loop_print_any ( times2 + 1, times, message );	/* 再帰を利用して残りを行う */
						 		 	 	/* times2 + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	/* 昔の課題 : 自分の名前を 100 以上を出力する */
	loop_loop_print_any ( "**********", "**********","Hello, World\n" );
	return 0;
}
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_any( times );			/* 繰り返したい内容 */
		loop_print_any ( times + 1 );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	loop_print_any ( "Hello, World\n" );
	return 0;
}
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times, char *message ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_any( message );			/* 繰り返したい内容 */
		loop_print_any ( times + 1, message );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	loop_print_any ( "***", "*****" );
	/*
		=>
			print_any( "*****" );
			print_any( "*****" );
			print_any( "*****" );
		=>
			***************
		=>
			長さ 5 の文字列が 3 回出力 => 長さ 15 の文字列が出力される
				=> 一種の掛け算を行っている
	*/
	
	return 0;
}
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_any( times );				/* 繰り返したい内容 */
		loop_print_any ( times + 1 );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	loop_print_any ( "*****" );
	/*
		print_any( times );
		print_any( times );
		print_any( times );
		print_any( times );
		print_any( times );		times の内容は、だんだん短くなる
		=>
		print_any( "*****" );
		print_any( "****" );
		print_any( "***" );
		print_any( "**" );
		print_any( "*" );
		=>
		***************
					=> 5 + 4 + 3 + 2 + 1 => 15 の長さの文字列
					=> 階和の計算になっている
	*/
	return 0;
}
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_any : 引数に指定されたメッセー時を出力 (繰り返したい内容)
 */
void print_any ( char *message ) {
	 printf ( message );		/* 引数で指定された文字列を出力 */
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	二つ目以降の引数は、繰り返しに必要データを受け渡すために使用
*		=> 変更しなくてもよい (再帰の時に、そのまま、引き渡す)
 */
void loop_print_any ( char *times, char *message ) {
	if ( !strcmp ( times, "" ) ) {
		print_any( message );
	} else {
		loop_print_any ( times + 2, message + 1 );
		/* 「times + 2」? => 「(times + 1)+1」と考えてよい
			=> 二文字短くなる */
	}
}
/*
 * main 関数
 */
int main ( void ) {
	printf ( "****の場合\n" );
	loop_print_any ( "****", "****" );
	/*
		loop_print_any ( "****", "****" );
		=>
			loop_print_any ( "****" + 2, "****" + 1 );
		=>
			loop_print_any ( "**", "***" );
		=>
			loop_print_any ( "**" + 2, "***" + 1 );
		=>
			loop_print_any ( "", "**" );
		=>
			print_any ( "**" );
		=>
			**
			結果的に、半分の長さ (/2)を計算する
	*/
	printf ( "\n" );
	printf ( "**********の場合\n" );
	loop_print_any ( "**********", "**********" );
	printf ( "\n" );
	return 0;
}
#include <stdio.h>
int main(void) {
	putchar ( 'a' );	/* 「a」を画面に出力する */
	return 0;
}
#include <stdio.h>
/* putchar で Hello, World */
int main(void) {
	putchar ( 'H' );
	putchar ( 'e' );
	putchar ( 'l' );
	putchar ( 'l' );
	putchar ( 'o' );
	putchar ( '\n' );	/* 「\n」で一つ「改行」という文字を表す */
	return 0;
}
#include <stdio.h>
int main(void) {
	printf ( "'a'\n" );
	putchar ( 'a' );	/* 「a」を画面に出力する */
	printf ( "\n" );
	printf ( "\"a\"\n" );	/* \" は「"」自身表す */
	printf ( "a" );	/* 「a」を画面に出力する */
	printf ( "\n" );
	printf ( "'a'+1\n" );
	putchar ( 'a' + 1 );	/* 「?」を画面に出力する */
	printf ( "\n" );
	printf ( "\"a\" + 1\n" );	/* \" は「"」自身表す */
	printf ( "a" + 1 );	/* 「」を画面に出力する */
	printf ( "\n" );
	return 0;
}
/*
 * 2019/05/24 sample-001.c
 */
/*
 * 「再帰呼出し」を利用した「繰返し」
 *		「繰返し」: 「同じ命令」を何度行う事	
 */
#include <stdio.h>
#include <string.h>
/*
 * print_hello : 「Hello, World」の出力 (繰り返したい内容)
 */
void print_hello ( void ) {
	 printf ( "Hello, World\n" );
}
/*
 * 最初の引数で指定された文字列の長さだけ、「何か」をくりかえす
 *	"Hello, World\n" を繰り返す場合
 */
void loop_print_hello ( char *times ) {
	if ( !strcmp ( times, "" ) ) {		/* times が "" の時 */
	 	/* やる事は何もない */			/* 「再帰/繰返し」の終了条件 */
	} else {							/* まだ繰り返す必要がある */
		print_hello();					/* 繰り返したい内容 */
		loop_print_hello ( times + 1 );	/* 再帰を利用して残りを行う */
						 		 	 	/* times + 1 によって times が短くなる */
	}
}
/*
	再帰呼び出しを使った繰り返しのパターン
		1. 繰り返したい命令を決める
			=> print_hello();
		2. 繰り返しを行う関数名を定める
			=> loop_print_hello
		3. 繰り返す条件を考えるために、何を使うかを決める
			「何」は、「だんだんと『小さく』なり、最後に『終わり』が判定できるもの」
				=> 対象は「文字列」しかないので、一択
			=> 「文字列」
		4. 次の関数を定義
			void 関数名 ( 減ってゆく物 ) {
				if ( 減ってゆく物が「終わり」) {
					なにもしない
				} else {
					繰り返したい事
					関数 ( 減ってゆく物 を減らす )
				}
			}
		5. 繰り返す量を表す、「減ってく行く物」を引数に関数を呼び出す
			=> loop_print_hello ( "***" );	: 長さ 3 の文字列なので、三回繰り返す
	*/
/*
 * main 関数
 */
int main ( void ) {
	printf ( "*** : 三回\n" );
	loop_print_hello ( "***" );	/* 三回繰り返す */
	printf ( "***** : 五回\n" );
	loop_print_hello ( "*****" );	/* 五回繰り返す */
	printf ( "Hello : 五回\n" );
	loop_print_hello ( "Hello" );	/* 五回繰り返す */
	
	return 0;
}
[先週の復習] Turtle Graphics の導入 => この追加説明と課題 再帰呼び出し(関数の再帰定義) 関数の定義の時に、自分自身を呼び出す 1. 「繰り返し」が可能になる 例 : ピラミッド => だんだん、文字列を短くしながら、出力する 「短くする、短くしたものを出力する」が繰り返されている [ポイント] 「記述」としては、「有限」だが 「実行結果」は「(原理的に..)無限」になる 2. 命令の組み合わせ a. 順接/ b. 条件分岐 / c.繰り返し(再帰的定義) => 原理的に可能な事は、すべてのこの三つの組み合わせだけでできる <= 「プログラムの作成方法」としては、「すべて」学んだ事 「原理的に可能」と「実際にできる」は違うので 「実際の問題」にたいして、「どうように適用するか」を話したい => 「アルゴリズム」の内容、分野毎にテクニックがある [今週の話] 再帰を用いた「繰り返し」 同じ命令 ( 命令は同じでも、変数が含まていれば、変数の変化によって、 異なる振る舞いをする可能性がある ) 1. 「繰り返し」を記述するための、「再帰」のパターンがある その「パターン」を利用すれば、簡単に(再帰を使って)繰り返しが表現できる 2. 引数を利用する事により、「繰り返し」の結果を変える事ができる # 変化しなものを利用する事が多い 3. 繰り返しに利用する「文字列:機械的[だんだん短くなる]に変化する」を利用する、 さらに、いろいろな事が可能なる (4. 追加する引数も変化させる事も考えられる) [前半] 再帰 => 繰り返し => いろいろなパターンを話した => ちょっとした変更によって、いろいろな事可能になる [前回の課題] Turtle Graphics を利用して、「回」のように見える図をかけ *********** * * * ***** * * * * * * * * * * ***** * * * *********** 例題として、四角を書くプログラムがあるので、それを利用する.. Turtle Graphics を利用する [準備] #include "s_turtle.h" <= 亀の命令に必要 亀のできること s_turtle_move : いま居る所に足跡を残し、次に進む s_turtle_jump : いま居る所に足跡を残さず、次に進む s_turtle_turn : 向きを 45 度だけ時計まわりに向きを変える s_turtle_stop : 亀プログラムの終了 : return 0 の前に呼び出す !! これまでは、「できること」は、「printf を利用してメッセージを出す」事だけ !! => 「できる事」が増えた !! 「単語」が増えた !! 「単語」=> あらかじめ用意されていて、それを呼ぶだけで、ある程度の事をやってくれる(関数) !! => 「単語」を増やすと、できる事が増える !! 「単語」使い方や意味の説明(規則:「仕様」)の事を API と呼ぶ !! API : Application Program Interface !! 応用プログラムを作成するための了解(プログラムを作成する人と、その単語[機能]を提供側)ルール !! => API に従って呼び出せば、適切なサービス受けられる !! 「ルールを守る」という『対価』に対して「サービス」が受けられる - turtle graphics を利用するプログラムは、turtle フォルダの下に置く - コンパイル/リンク/実行する場合 「make BASE=ソースファイル名の拡張子を取り除いたもの test」 cf. make BASE=20190517-01-9999 test [ ubunt アプリケーションで、グラフィックスのプログラムを実行する場合] => XLaunch を動かす必要がある。 [文字列と『文字』の話] printf ( 文字列 ) => 画面に文字が表示される 「文字列」=> 「"」?「"」: 「"」で挟まれたもの cf. "abc" : 長さ 3 の文字列で、その文字列は「a」,「b」,「c」からなる <新規> putchar ( 文字 ) => 画面に「文字」が表示される 「文字」=> 「'」+ 半角一文字 + 「'」: 「'」で挟まれた一つの文字 cf. 'a' => 「a」という一つの文字 !! 「文字」と「文字列」は違うもの(異なるデータ型のデータ) !! "a" : 長さが 1 で、「a」一文字からなる「文字列」 !! 'a' : 「a」一文字
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20190524-01.c
/*
 * 20190524-01-QQQQ.c
 *	与えられた文字列の文字を二度ずつ出力する関数を作成する
 */
#include <stdio.h>
#include <strings.h>
/*
 * double_print
 *	与えられた文字列(message)の文字を二度ずつ出力する
 */
void double_print ( char *message ) {
  if ( !strcmp ( message, "" ) ) {	/* 空文字列だった */
	/* なにもする必要はない */
  } else {
  	putchar ( *message );			/* 取り敢えず、一つ分は出す */
	/*
	**	 この部分を完成させなさい
	*/
	double_print ( message + 1 );	/* 再帰呼出しをする */
  }
}
/*
 * main
 */
int main ( void ) {
	double_print ( "abc" );
	printf ( "\n" );
	double_print ( "1234567" );
	printf ( "\n" );
	return 0;
}
$ ./20190524-01-QQQQ.exe aabbcc 11223344556677 $
Download : 20190524-02.c
/*
 * 20190524-02-QQQQ.c
 *	与えられた文字列の文字を逆順に出力する関数を作る
 */
#include <stdio.h>
#include <strings.h>
/*
 * reverse_print
 *	与えられた文字列(message)の文字を逆順に出力する
 */
void reverse_print ( char *message ) {
  if ( !strcmp ( message, "" ) ) {	/* 空文字列だった */
	/* なにもする必要はない */
  } else {
	/* ここで再帰呼出しを行うのだが... */
	/*
	**	 この部分を完成させなさい
	*/
  }
}
/*
 * main
 */
int main ( void ) {
	reverse_print ( "abc" );
	printf ( "\n" );
	reverse_print ( "1234567" );
	printf ( "\n" );
	return 0;
}
$ ./20190524-02-QQQQ.exe cba 7654321 $