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 $