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 $