Download : sample-001.c
/*
 * 2018/09/28 sample-001.c
 *
 *	[コンパイル]
 *		cc -I ~/include -c sample-001.c
 *	[リンク]
 *		cc -o sample-001.exe sample-001.o
 *	[実行]
 *		./sample-001.exe
 */
/*
 * 入力を一度だけ処理
 */
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
 * main 関数
 */
int main ( int argc, char *argv[] ) {
	s_print_string ( "整数値を一つ入力してください、一つ増やした値を出力します:" );
	s_print_int ( s_input_int() + 1 );	/* 整数値を入力し、1 を増やし、出力 */
	s_print_newline();
	return 0;
}
123
$ ./sample-001.exe < sample-001.in 整数値を一つ入力してください、一つ増やした値を出力します:123 124 $
Download : sample-002.c
/*
 * 2018/09/28 sample-002.c
 *
 *	[コンパイル]
 *		cc -I ~/include -c sample-002.c
 *	[リンク]
 *		cc -o sample-002.exe sample-002.o
 *	[実行]
 *		./sample-002.exe
 */
/*
 * 入力を複数回処理
 * 		入力関数(s_input_int())が呼び出される度に、入力が行われる
 */
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
 * main 関数
 */
int main ( int argc, char *argv[] ) {
	/*
	 *	一回目
	 */
	s_print_string ( "一回目:整数値を一つ入力してください、一つ増やした値を出力します:" );
	s_print_int ( s_input_int() + 1 );
	s_print_newline();
	/*
	 *	ニ回目
	 */
	s_print_string ( "ニ回目:整数値を一つ入力してください、一つ増やした値を出力します:" );
	s_print_int ( s_input_int() + 1 );
	s_print_newline();
	/*
	 *
	 */
	return 0;
}
123 456
$ ./sample-002.exe < sample-002.in 一回目:整数値を一つ入力してください、一つ増やした値を出力します:123 124 ニ回目:整数値を一つ入力してください、一つ増やした値を出力します:456 457 $
Download : sample-003.c
/*
 * 2018/09/28 sample-003.c
 *
 *	[コンパイル]
 *		cc -I ~/include -c sample-003.c
 *	[リンク]
 *		cc -o sample-003.exe sample-003.o
 *	[実行]
 *		./sample-003.exe
 */
/*
 * 一つの入力を複数回処理
 * 		入力関数の呼出し(入力)は一回だが、値(入力値)は複数利用したい
 * 			関数(変数)を利用するしかない
 */
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
 *	引数で与えらえた値を複数回利用する(関数/引数変数の特権 !!)
 */
void print_add_one_result ( int value ) {
	 s_print_string ( "整数値 " );
	 s_print_int ( value );				/* 一度目の利用 */
	 s_print_string ( " に 1 を加えた値は " );
	 s_print_int ( value + 1 );			/* 二度目の利用 */
	 s_print_string ( "これを 2 倍した値は " );
	 s_print_int ( value * 2 );			/* 三度目の利用 */
	 s_print_string ( " になります。\n" );
}
/*
 * main 関数
 */
int main ( int argc, char *argv[] ) {
	/*
	 *	一回目
	 */
	 print_add_one_result ( s_input_int() );	/* 「入力(機能)」は「ここ」で一回 */
												/* 「入力値」は、関数内で、何度も利用可能 */
	/*
	 *	ニ回目
	 */
	 print_add_one_result ( s_input_int() );	/* 二度目の入力 */
	/*
	 *
	 */
	return 0;
}
123 456
$ ./sample-003.exe < sample-003.in 123 整数値 123 に 1 を加えた値は 124これを 2 倍した値は 246 になります。 456 整数値 456 に 1 を加えた値は 457これを 2 倍した値は 912 になります。 $
Download : sample-004.c
/*
 * 2018/09/28 sample-004.c
 *
 *	[コンパイル]
 *		cc -I ~/include -c sample-004.c
 *	[リンク]
 *		cc -o sample-004.exe sample-004.o
 *	[実行]
 *		./sample-004.exe
 */
/*
 * インプットループ
 * 		入力を繰り返す関数
 */
#include <stdio.h>
/*
 *	改行 ('\n') が入力されるまで、文字を入力し、それを二度ずつ出力する
 */
void print_twice_char ( char ch ) {
	putchar ( ch );	/* とりあえず二度出力 */
	putchar ( ch );
	if ( ch == '\n' ) {		/* 改行だった / もうこれ以上処理しない */
	   /* 何もしない */
	} else {		 		/* まだ処理する必要がある */
		print_twice_char ( getchar() );	/* 入力をして、再帰 */
	}
}
/*
 * main 関数
 */
int main ( int argc, char *argv[] ) {
	/*
	 *	最初の呼出しは main で..
	 */
	print_twice_char ( getchar() );
	/*
	 *
	 */
	return 0;
}
abc$
$ ./sample-004.exe < sample-004.in abc$ aabbcc$$ $
Download : sample-005.c
/*
 * 2018/09/28 sample-005.c
 *
 *	[コンパイル]
 *		cc -I ~/include -c sample-005.c
 *	[リンク]
 *		cc -o sample-005.exe sample-005.o
 *	[実行]
 *		./sample-005.exe
 */
/*
 * 乱数
 */
#include <stdio.h>
#include "s_print.h"
#include "s_random.h"	/* s_random を利用するので.. */
/*
	s_init_random() --- 乱数系列を現在の時刻を利用して決定
	s_random() --- 整数値を持つ(疑似)一様乱数を返す
 */
/*
 * main 関数
 */
int main ( int argc, char *argv[] ) {
	/*
	 *
	 */
	s_init_random();	/* 乱数系列の初期化 */
	/*
	 *
	 */
	s_print_string ( "乱数を出力します : " );
	s_print_int ( s_random() );
	s_print_newline();
	/*
	 *
	 */
	return 0;
}
$ ./sample-005.exe 乱数を出力します : 2116658382 $
#include <stdio.h>
/*
	完全に動くプログラムで、いろいろなプログラムの元になる
*/
int main(int argc, char *argv[]) {
	printf ( "Hello, World\n" );
	return 0;
}
#include <stdio.h>
/*
	完全に動くプログラムで、いろいろなプログラムの元になる
*/
int main(int argc, char *argv[]) {
	printf ( "Hello, World\n" );			/* 命令 A */
	printf ( "Hello, World, again\n" );		/* 命令 B */
	return 0;
}
#include <stdio.h>
/*
	完全に動くプログラムで、いろいろなプログラムの元になる
*/
int main(int argc, char *argv[]) {
	printf ( "Hello, World, again\n" );		/* 命令 B */
	printf ( "Hello, World\n" );			/* 命令 A */
	return 0;
}
#include <stdio.h>
/*
*/
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if ( getchar() == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else {
		printf ( "Bye\n" );		/* 条件が成立しなかったとき */
	}
	
	return 0;
}
#include <stdio.h>
/*
	再帰呼び出しを利用して、繰り返しを行う
		ntimes_print
*/
void ntimes_print ( int times, char *string ) {
	if ( times <= 0 ) {	/* 条件 P */
		/* なにもしない */
	} else {
		printf ( string );	/* 繰り返ししたい命令 A */
		ntimes_print ( times - 1, string );
							/* 再帰呼び出し */
							/* 自分自身を呼び出す */
	}
	
}
int main(int argc, char *argv[]) {
	ntimes_print ( 3, "Hello, World\n" );
	ntimes_print ( 5, "Bye Bye\n" );
	return 0;
}
#include <stdio.h>
/*
	p-001.c の 9 行目に hello という名前をつけて、
	main ではそれを利用するして、同じ結果を実現する。
*/
void hello (void) {		/* hello という関数の定義 */
	printf ( "Hello, World\n" );
}
int main(int argc, char *argv[]) {
	hello();	/* hello 関数の呼び出し */
	
	return 0;
}
#include <stdio.h>
/*
	引数をつけた関数
		引数で指定された文字列を三度書く
*/
void three_print (char *string) {		/* hello という関数の定義 */
	printf ( string );
	printf ( string );
	printf ( string );
}
int main(int argc, char *argv[]) {
	three_print( "Hello, World\n" );	/* hello 関数の呼び出し */
	three_print( "Bye, Bye\n" );	/* hello 関数の呼び出し */
	return 0;
}
#include <stdio.h>
/*
 * 引数で与えられた、一文字の内容によって、
	Hello ( 文字が 'a' の場合)か、Bye (その他) を出力する
*/
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else {
		printf ( "Bye\n" );		/* 条件が成立しなかったとき */
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 * 引数で与えられた、一文字の内容によって、
	'a'		"Hello"
	'b'		"Good morning"
	other	"Bye"
*/
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else {					/* a でなかった... */
		if ( ch == 'b' ) {		/* 改めて、b かどうかを判定する */
			printf ( "Good morning\n" );	/* 条件が成立したとき */
		} else {
			printf ( "Bye\n" );		/* 条件が成立しなかったとき */
		}
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 * 引数で与えられた、一文字の内容によって、
	'a'		"Hello"
	'b'		"Good morning"
	other	"Bye"
*/
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else {
		/* nothing */
	}
	if ( ch == 'b' ) {		/* 改めて、b かどうかを判定する */
		printf ( "Good morning\n" );	/* 条件が成立したとき */
	} else {
		printf ( "Bye\n" );		/* 条件が成立しなかったとき */
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 * 引数で与えられた、一文字の内容によって、
	'a'		"Hello"
	'b'		"Good morning"
	'c'		"Good night"
	other	"Bye"
*/
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else {					/* a でなかった... */
		if ( ch == 'b' ) {		/* 改めて、b かどうかを判定する */
			printf ( "Good morning\n" );	/* 条件が成立したとき */
		} else {
			if ( ch == 'c' ) {		/* 改めて、c かどうかを判定する */
				printf ( "Good night\n" );	/* 条件が成立したとき */
			} else {
				printf ( "Bye\n" );		/* 条件が成立しなかったとき */
			}
		}
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 * 引数で与えられた、一文字の内容によって、
	'a'		"Hello"
	'b'		"Good morning"
	'c'		"Good night"
	other	"Bye"
*/
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else if ( ch == 'b' ) {		/* 改めて、b かどうかを判定する */
		printf ( "Good morning\n" );	/* 条件が成立したとき */
	} else if ( ch == 'c' ) {		/* 改めて、c かどうかを判定する */
		printf ( "Good night\n" );	/* 条件が成立したとき */
	} else if ( ch == 'd' ) {		/* 改めて、c かどうかを判定する */
		printf ( "sayonara\n" );	/* 条件が成立したとき */
	} else {
		printf ( "Bye\n" );		/* 条件が成立しなかったとき */
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 */
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	} else {
		/* nothing */
		/* 条件が、不成立の場合に何もしないなら、
			else 節ごと省略可能 */
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 */
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		printf ( "Hello\n" );	/* 条件が成立したとき */
	}	/* else 節の文が何もないので、省略 */
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 */
void if_sample ( char ch ) {
	if ( ch == 'a' ) {
		/* ここは、何もなくても、省略できない .. */
	} else {
		printf ( "Hello\n" );	/* 条件が成立しないとき */
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 */
void if_sample ( char ch ) {
	if ( ! (ch == 'a') ) {	/* ! を利用して、条件を反転できる */
		/* 「!(ch == 'a')」 は「 ch != 'a'」と同じ */
		printf ( "Hello\n" );	/* 条件が成立しないとき */
	}
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 */
void if_sample ( char ch ) {
	if ( ! (ch == 'a') )
		printf ( "Hello\n" );
	else
		printf ( "Bye\n" );
	/* 文が一つしかない場合は、 {, } を省略可能 */
	/* ぶらさがり構文 */
	/* !!!! 「絶対に省略しない方がよい」*/
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
/*
 */
void if_sample ( char ch ) {
	if ( ch != 'a' )
		if ( ch != 'b' )
			printf ( "Good morning\n");
	else
		printf ( "Bye\n" );
	/*
		a でも b でもなければ、Good morning
		a だったら Bye
		b だったら なにもでない
	[考えた事]
	if ( ch != 'a' ) {
		if ( ch != 'b' ) {
			printf ( "Good morning\n");
		} else {
		}
	} else {
		printf ( "Bye\n" );
	}
	[機械的に省略]
	if ( ch != 'a' )
		if ( ch != 'b' )
			printf ( "Good morning\n");
	else
		printf ( "Bye\n" );
	[誤解を受ける..]
	if ( ch != 'a' ) {
		if ( ch != 'b' ) {
			printf ( "Good morning\n");
		} else {
			printf ( "Bye\n" );
		}
	} else {
	}
	*/
}
int main(int argc, char *argv[]) {
	/* キーボードから 1 文字入力し、'a' だったら Hello,
		そうでなかったら、bye を出力する */
	if_sample ( getchar() );	/* 一文字入力して、その結果を
									関数 if_sample に渡す */
	return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
	char buf[100];
	
	gets ( buf );
	return 0;
}
#include <stdio.h>
extern void even ( int n );
void odd ( int n ) {
	if ( n <= 0 ) {
		/**/
	} else {
		printf ( "奇数\n" );
		even ( n-1 );
	}
}
void even ( int n ) {
	if ( n <= 0 ) {
		/**/
	} else {
		printf ( "偶数\n" );
		odd ( n-1 );
	}
}
int main(int argc, char *argv[]) {
	odd ( 5 );
	return 0;
}
#include <stdio.h>
#include "s_print.h"
int inc(int n) {
	return n + 1;	/* 与えれた整数値に 1 を加える */
}
/*
	関数 inc は純粋関数
		inc(10)の結果は 11 だが
		inc(10)+inc(10) と 2*inc(10) の結果は同じ
*/
int main(int argc, char *argv[]) {
	s_print_int ( 10 );
	s_print_string ( "に 1 を加えると" );
	s_print_int ( inc(10) );
	s_print_string ( "になる。" );
	return 0;
}
#include <stdio.h>
#include "s_print.h"
int inc(int n) {
	return n + 1;	/* 与えれた整数値に 1 を加える */
}
/*
	関数 inc は純粋関数
		inc(10)の結果は 11 だが
		inc(10)+inc(10) と 2*inc(10) の結果は同じ
*/
int main(int argc, char *argv[]) {
	s_print_int ( inc(10) + inc(10) );
	s_print_string ( "になる。\n" );
	s_print_int ( 2 * inc(10) );
	s_print_string ( "になる。\n" );
	return 0;
}
#include <stdio.h>
#include "s_print.h"
int inc(int n) {
	putchar ( 'x' );	/* 出力 : 副作用の例 */
	return n + 1;	/* 与えれた整数値に 1 を加える */
}
/*
	関数 inc は純粋関数
		inc(10)の結果は 11 だが
		inc(10)+inc(10) と 2*inc(10) の結果は同じ
*/
int main(int argc, char *argv[]) {
	s_print_int ( inc(10) + inc(10) );
	s_print_string ( "になる。\n" );
	s_print_int ( 2 * inc(10) );
	s_print_string ( "になる。\n" );
	return 0;
}
#include <stdio.h>
int main(int argc, char *argv[] ) {
	/* シーザ暗号 */
	/*
		a => c
		b => d
			..
	*/
	printf ( "一文字入力してください : " );
	putchar ( getchar () + 2 );
	putchar ( '\n' );
	return 0;
}
#include <stdio.h>
int main(int argc, char *argv[] ) {
	/* シーザ暗号 */
	/*
		a => c
		b => d
			..
	*/
	printf ( "一文字入力してください : " );
	if ( getchar() >= 'y' ) {
		putchar ( 'a' + getchar() - 'y' );
		/*
			'y' -> 'a' + 'y' - 'y' => 'a'
			'z' => 'a' + 'z' - 'y' => 'a' + 1 => 'b'
		*/
	} else {
		putchar ( getchar() + 2 );
	}
	putchar ( '\n' );
	return 0;
}
#include <stdio.h>
void f(int ch) {
	/* getchar() が返す値は、変数 ch にコピーされ.. */
	if ( ch >= 'y' ) {				/* 変数を何度参照しても、同じ値 */
		putchar ( 'a' + ch - 'y' );
		/*
			'y' -> 'a' + 'y' - 'y' => 'a'
			'z' => 'a' + 'z' - 'y' => 'a' + 1 => 'b'
		*/
	} else {
		putchar ( ch + 2 );
	}
	putchar ( '\n' );
}
int main(int argc, char *argv[] ) {
	/* シーザ暗号 */
	/*
		a => c
		b => d
			..
	*/
	printf ( "一文字入力してください : " );
	f(getchar());	/* getchar() を一度しか呼ばない */
	return 0;
}
[前回]
	レーシングゲームを作ってみた
		C 言語で作成されているので、C 言語の知識が必要
			=> 前期(ソフトウェア概論 A)の知識で十分
		アプリケーション固有(ゲーム)の知識が必要
			リアルタイムなキー入力が必要
			画面操作(画面表示の一部だけを書き換える機能)
			乱数
		アイディア
		手順を作る(アルゴリズム)
[ガイダンス]
	前期(ソフトウェア概論 A)やコンピュータ概論と方針は同じ
		ソフトウェア概論 Aの知識は仮定
			うるさくするな
			課題と試験で成績を付ける
[復習(ソフトウェア概論 A)]
	ソフトウェア概論 A/B の目的
		C 言語でプログラムが作成できるようにしよう
			自分の目的に沿ったプログラムができるとうれしい
				=> 自分の環境を良くしたい
	ソフトウェア概論 A/B の内容
		C 言語そのものの知識(C 言語で、どのように、目的の機能を表現するか)
			表現方法なので、語学
		プログラムのコンパイルの仕方と実行の仕方
			コンピュータの操作方法
		プログラミング: どのように考えて、プログラムを作成するか
			=> アルゴリズム概論でやる
				この講義でも少しずつふれる
				「分割統治法」
	C 言語そのもの
		「Hello, World」
		printf, getchar, putchar : 入出力関数
			プログラムと人間の間でデータの交換ができる
		構文 : 複数の命令を組み合わせて新しい命令を作る仕組み
			順接 : 二つの命令 A, B があったときに, 
				「A を実行してから B を実行する」という命令を作る
			条件判定 (if 構文) : 一つの条件 P と、二つの命令 A, B があったときに,
				「条件 P の成立、不成立によって A, B のどちらか一方を実行する」
				if ( P ) { A } else { B }
				!! この表現では A と B のどちらか一方しか実行されない			繰り返し : 条件 P と命令が A にあったときに
				条件 P が成立するかぎり、A を繰り返す
				!! A の記述は一度だが、実行は N 回(複数回)になる(かもしれない)
				「再帰呼び出しを使う」
			[まとめ] 任意のプログラム(上記の三つの構文以外の構文を利用したプログラム)に対して、それと同じ機能で、上記の三つの構文だけで作られたプログラムを作る事ができる。
				=> 他の(かっこよさげな..)構文を知らなくても、任意のプログラムが書ける。
		[関数]
			プログラム(の一部)に名前をつけて、
				その名前だけで、そのプログラムを実行する仕組み
					そのためのつくられたもの
						例 : main, printf, ... (自分でも作れる)
			関数の作り方(関数宣言)
			関数の利用の仕方(printf で、最初にやっている..)
				最初は引数無し => 引数を付けた場合
				引数付き
					引数と条件分岐を利用して、再帰呼び出し
		[型]
			「型」は「値の集合」+「その値の操作方法」
				int : 整数値( 0. 1. 2, .., -1, -2, .. ) + 四則(+.-,*,/, .. )
				char : 文字集合('A','b', '1'..)と、文字操作 (入出力、+1, -1 文字がずれる..)
				引数変数の「型」
					ある型の変数は、その型の値を記録している
						関数呼び出しをするときの引数の型と、関数定義をするときの仮引数変数の型は一致している必要がある。
	ソフトウェア概論 A では、たくさんの「おまじない」があった
		cf. #include <stdio.h>, char * (文字列..), etc..
			ソフトウェア概論 B では謎解きを行う予定
==
[ソフトウェア概論 B]
	条件分岐
		二つの命令のどちらか
			N の命令のいずれかの場合にも if 構文を組み合わせて(入れ子にして..)実現できる
				why : N => 1 + (N-1) の二つ分ければよい
					二つなので、 N は if 構文で処理可能
						N-1 の部分は、改めて考えればよい ( 再帰呼び出し / 数学的帰納法の考え方 )
	再帰呼び出し
		関数の本体で自分自身を呼び出すこと
			再帰的関数定義 : 再帰呼び出しを含む関数の定義
		再帰呼び出しを「限定的」に利用する事で、「繰り返し」が実現できる
	入出力は、副作用(関数の値を決める事以外の目的で働く機能)を持つ
		副作用を持つ関数を呼び出すと、
			呼び出した回数だけ、副作用が生じるので、
				呼び出す回数に意味がある
		一方、副作用をもたない関数(純粋関数)は、そのような事はない。
	p-018.c では、getchar() が何か所も現れるが、呼び出し回数が
		複数になるので、それぞれの関数の値は違うものになる
			=> 同じものとみなすと失敗する
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20180928-01.c
/*
 * 20180928-01-QQQQ.c
 *
 *	数当てを行う
 *
 *	コンパイル :
 *		cc -I ~/c/include -c 20180928-01-QQQQ.c
 *		cc -o 20180928-01-QQQQ.exe 20180928-01-QQQQ.o
 *	実行 :
 *		./20180928-01-QQQQ.exe
 *
 */
#include <stdio.h>
#include "s_print.h"	/* s_print_int を利用するので.. */
#include "s_input.h"	/* s_input_int を利用するので.. */
#include "s_random.h"	/* s_random を利用するので.. */
/*
 * prompt
 *		メッセージを出力し、キーボードから整数値を読み込んで、
 *		その値を返す関数
 */
int prompt(void) {
	s_print_string ( "私が選んだ数を予想して入力してください : " );
	return s_input_int();
}
/*
 */
void game ( int input, int answer ) {
	 if ( input == answer ) {	/* 入力と答えが一致した */
		s_print_string ( "お見事です。あたりました。\n" );
	 } else {
        if ( input > answer ) {	/* 入力が、答えより大きい */
	/*
	**	 この部分を完成させなさい
	*/
		} else {				/* 入力が、答えより小さい */
			s_print_string ( "その数は小さすぎます。\n" );
		}
		/* 未だ、答えが、当っていないので、ゲームを続ける.. */
	/*
	**	 この部分を完成させなさい
	*/
	 }
}
/*
 *	main
 */
int main( void )
{
	s_init_random();	/* 乱数系列の初期化 */
	s_print_string ( "私が考えた 1 〜 100 数を予想して当ててみてください。\n" );
    game ( prompt(), (s_random()%100) + 1 );
	return 0;
}
50 75 83 90 85 84
$ ./20180928-01-QQQQ.exe 私が考えた 1 〜 100 の数を予想して当ててみてください。 私が選んだ数を予想して入力してください : 5 5 その数は小さすぎます。 私が選んだ数を予想して入力してください : 60 60 その数は大きすぎます。 私が選んだ数を予想して入力してください : 30 30 お見事です。あたりました。 $
Download : 20180928-02.c
/*
 * CDATE FILENAME
 *
 *	与えられた自然数の素因数を出力する
 *
 *  12 は.. 
 *
 *	[コンパイル]
 *		cc -I ~/include -c FILENAME
 *	[リンク]
 *		cc -o BASENAME.exe BASENAME.o
 *	[実行]
 *		./BASENAME.exe
 *
 */
#include <stdio.h>
#include "s_print.h"	/* s_print_int を利用するので.. */
/*
 * void print_prime_factor_sequence ( int n, int p )
 *  機能 : p 以上の n の素因数を小さい順に並べで表示する
 *  条件 : n には p 未満の素因数を含まれていないものとする
 *	int n :  p 未満の素因数を含まれていない自然数
 *  返り値 : なし
 */
void print_prime_factor_sequence ( int n, int p ) {
	if ( p > n ) {	/* もう n には p 以上の素因数を含まない */
		/* 何もしなくてよい */
		/* 本来、ここにくるのは n = 1 の時だが、念の為 */
	} else if ( n % p == 0 ) {	/* n が p を素因数として含む */
	 	s_print_char ( ' ' );	/* 隙間を空け */
		s_print_int ( p );		/* 素因数を表示し */
		/* もう一度 p の要素があるかもしれないので、そこから試す [再帰] */
	/*
	**	 この部分を完成させなさい
	*/
	} else {	/* n が p を素因数として含まない */
		/* 本来は p の次の素数を試すべきだが.. */
		/* その代りに p + 1 を試す (のは無駄だが、正く動く) [再帰] */
	/*
	**	 この部分を完成させなさい
	*/
	}
}
/*
 * void print_prime_factor_of ( int n )
 *  機能 : n の素因数を出力する
 *	int n : 素因数を表示したい自然数
 *  返り値 : なし
 */
void print_prime_factor_of ( int n ) {
	if ( n < 1 ) { /* 与えらた数が自然数ではない */
		s_print_int ( n );
		s_print_string ( "は、自然数ではありません\n" );
	} else if ( n == 1 ) {  /* 与えられた数が 1 の場合 */
		s_print_int ( n );
		s_print_string ( "の素因数はありません\n" );
	} else {
		s_print_int ( n );
		s_print_string ( "の素因数分解は" );
	/*
	**	 この部分を完成させなさい
	*/
		s_print_string ( " となります。\n" );
	}
}
/*
 *	main
 */
int main( void )
{
	print_prime_factor_of ( 12 );
	return 0;
}
$ ./20180928-02-QQQQ.exe 12の素因数分解は 2 2 3 となります。 $