Download : sample-001.c
/*
 * 2017/06/09 sample-001.c
 */
/*
 * "Hello, World" again
 */
#include <stdio.h>
int main ( int argc, char *argv[] ) {
  printf ( "Hello, World\n" );	/* "Hello, World" という文字列と改行 ( "\n" ) を表示する */
  return 0;
}
$ ./sample-001.exe Hello, World $
Download : sample-002.c
/*
 * 2017/06/09 sample-002.c
 */
/*
 * プログラム・ノックアウト (1)
 */
#include <stdio.h>
int main ( int argc, char *argv[] ) {
	/* まず、printf をノックアウト */
  return 0;
}
$ ./sample-002.exe $
Download : sample-003.c
/* * 2017/06/09 sample-003.c */ /* * プログラム・ノックアウト (2) */ /* * main 関数もなくしたら ? */ /* ここには何もない */
$ cc -c sample-003.c $ cc -o sample-003.exe sample-003.o /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 0 が無効なシンボル索引 11 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 1 が無効なシンボル索引 12 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 2 が無効なシンボル索引 2 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 3 が無効なシンボル索引 2 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 4 が無効なシンボル索引 11 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 5 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 6 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 7 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 8 が無効なシンボル索引 12 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 9 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 10 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 11 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 12 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 13 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 14 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 15 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 16 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 17 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 18 が無効なシンボル索引 13 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): 再配置 19 が無効なシンボル索引 21 を持っています /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): 再配置 0 が無効なシンボル索引 2 を持っています /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: 関数 `_start' 内: (.text+0x20): `main' に対する定義されていない参照です collect2: error: ld returned 1 exit status $
Download : sample-004.c
/*
 * 2017/06/09 sample-004.c
 */
/*
 * プログラム・ノックアウト (3)
 */
/*
 *	#include <stdio.h> // #include を無くした
 */
int main ( int argc, char *argv[] ) {
  printf ( "Hello, World\n" );	/* この行で「警告」が出る */
  return 0;
}
$ cc -c sample-004.c sample-004.c: In function ‘main’: sample-004.c:15:3: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default] printf ( "Hello, World\n" ); /* この行で「警告」が出る */ ^ $
Download : sample-005.c
/*
 * 2017/06/09 sample-005.c
 */
/*
 * プログラム・ノックアウト (4)
 */
/*
 *	#include <stdio.h> // #include を無くした
 */
int main ( int argc, char *argv[] ) {
	/* printf も使わないと、「警告」はなくなった */
  return 0;
}
$ ./sample-005.exe $
Download : sample-006.c
/*
 * 2017/06/09 sample-006.c
 */
/*
 * プログラム・ノックアウト (5)
 */
void main ( void ) {	/* int を void に変更, 引数宣言もなくして良い */
	 /* return 0; を削って、空っぽにする */
}
/*
	最も短い C 言語プログラムの実現
*/
$ ./sample-006.exe $
Download : sample-007.c
/*
 * 2017/06/09 sample-007.c
 */
/*
 * プログラム・ノックアウト (6)
 */
/*
 *	#include の代りに printf の extern 宣言
 */
extern int printf ( const char *message, ... );
	/* 「extern void printf ( char *message );」 ではない ?? */
/*
 * main
 */
int main ( int argc, char *argv[] ) {
  printf ( "Hello, World\n" );	/* 「警告」が消えた */
  return 0;
}
$ ./sample-007.exe Hello, World $
Download : sample-008.c
/*
 * 2017/06/09 sample-008.c
 */
#include <stdio.h>
/*
 * 文字列を三度表示する : 関数定義の例
 */
void threeTimesPrint ( char *message )	{
	 printf ( message );		/* 一度目 */
	 printf ( message );		/* ニ度目 */
	 printf ( message );		/* 三度目 */
}
/*
 * main
 */
int main ( int argc, char *argv[] ) {
	threeTimesPrint ( "Hello\n" );		/* 関数呼出しの例 */
	threeTimesPrint ( "こんにちは\n" );
	return 0;
}
$ ./sample-008.exe Hello Hello Hello こんにちは こんにちは こんにちは $
Download : sample-009.c
/*
 * 2017/06/09 sample-009.c
 */
#include <stdio.h>
/*
 * echo_char ( char ch )
 *	char ch	--	引数で指定された文字
 *		引数で指定された文字を『』付で出力
 */
void echo_char ( char ch )	{
	 printf ( "『" );
	 putchar ( ch );		/* 引数で指定された文字を出力する */
	 printf ( "』" );
}
/*
 * main
 */
int main ( int argc, char *argv[] ) {
	printf ( "何か文字を入れてから[Enter]キーを押す : " );
	echo_char ( getchar() );	/* getchar() で文字を読込み、それを出力 */
	putchar ( '\n' );
	return 0;
}
A
$ ./sample-009.exe < sample-009.in 何か文字を入れてから[Enter]キーを押す : A 『A』 $
Download : sample-010-01.c
/*
 * CDATE sample-010-01.c
 */
#include <stdio.h>		/* putchar が必要なので.. */
/*
 *	nprinttail
 *	n 回数 message を出力するが、行末を変更する。
 */
void nprinttail ( char *tail, char *message ) {
	if ( *tail == '\0' ) {
	} else {
		printf ( message );
		if ( *tail == '\n' )	{	/* 改行の時のみ */
			putchar ( '\n' );		/* 改行する */
		} else {					/* それ以外は */
	  		/* 何もしない */
		}
		nprinttail ( tail + 1, message );
	}
}
Download : sample-010.c
/*
 * 2017/06/09 sample-010.c
 */
/*
 * extern 宣言
 */
extern void println ( char *message );
extern void nprinttail ( char *tail, char *message );
/*
 * n 回数の繰返し
 */
int main ( int argc, char *argv[] ) {
	 println ( "毎回改行「Hello」: " );
	 nprinttail ( "\n\n\n", "Hello" );
	 println ( "3 回目, 7 回目だけ改行「Hello」: " );
	 nprinttail ( "12\n456\n", "Hello" );
	 return 0;
}
$ ./sample-010.exe $
Download : sample-011.c
/*
 * 2017/06/09 sample-011.c
 */
#include <stdio.h>
/*
 * 文字の扱い
 */
int main ( int argc, char *argv[] ) {
	printf ( "abc\n" );		/* 「abc(改行)」とでる */
	printf ( "abc\n" + 1 );	/* 「bc(改行)」とでる ( 1 を加えると短くなる ) */
	putchar ( 'A' );		/* 「A」とでる */
	putchar ( '\n' );		/* 「(改行)」とでる */
	putchar ( 'A' + 1 );	/* 文字に 1 を加えると ? */
	putchar ( '\n' );		/* 「(改行)」とでる */
	return 0;
}
$ ./sample-011.exe abc bc A B $
Download : sample-012.c
/*
 * 2017/06/09 sample-012.c
 */
/*
 * extern 宣言
 */
extern void printcharln ( char ch );
/*
 * 文字の扱い(2)
 */
int main ( int argc, char *argv[] ) {
	printcharln ( 'A' + 1 );		/* 'B' になった */
	printcharln ( 'B' + 1 );		/* 'C' になる */
	printcharln ( 'A' + 1 + 1 );	/* これも 'C' になる */
	printcharln ( 'A' + 0 );		/* これはもちろん 'A' */
	printcharln ( 'A' + 10 );		/* 'A', 'B', .., 'J', 'K' になるはず */
	printcharln ( 'A' + 25 );		/* 'Z' !! */
	printcharln ( 'Z' + 1 );		/* ??? */
	return 0;
}
$ ./sample-012.exe $
Download : sample-013.c
/*
 * 2017/06/09 sample-013.c
 */
/*
 * extern 宣言
 */
extern void nprintcharln ( char *n, char ch );
extern void printcharln ( char ch );
extern void println ( char *string );
/*
 * 文字の扱い(3)
 */
int main ( int argc, char *argv[] ) {
	println ( "'A' から 10 個 :" );
	nprintcharln ( "1234567890", 'A' );
	println ( "'U' から 10 個 :" );
	nprintcharln ( "1234567890", 'U' );
	println ( "'k' から 10 個 :" );
	nprintcharln ( "1234567890", 'k' );
	println ( "'0' から 10 個 :" );
	nprintcharln ( "1234567890", '0' );
	println ( "'9' + 1 は.. :" );
	printcharln ( '9' + 1 );		/* 残念ながら "10" ではない */
	return 0;
}
$ ./sample-013.exe $
Download : sample-014.c
/*
 * 2017/06/09 sample-014.c
 */
/*
 * extern 宣言
 */
extern void println ( char *string );
extern void printonedigit ( int n );
extern void printonedigitln ( int n );
/*
 * 整数
 */
int main ( int argc, char *argv[] ) {
	println ( "整数値 0 の出力" ); 
	printonedigitln ( 0 );			/* 「'0'」 でも 「"0"」 でもなく 「0」 */
	println ( "整数値 9 の出力" ); 
	printonedigitln ( 9 );			/* 一桁は OK */
	println ( "整数値 11 の出力" ); 
	printonedigitln ( 11 );		   /* 上手く行かない */
	println ( "整数値 1 + 1 の出力" ); 
	printonedigitln ( 1 + 1 );		/* やっと計算がでてきた */
	println ( "整数値 5 - 2 の出力" ); 
	printonedigitln ( 5 - 2 );		/* 引算 */
	println ( "整数値 3 * 2 の出力" ); 
	printonedigitln ( 3 * 2 );		/* かけ算 */
	println ( "整数値 8 / 3 の出力" ); 
	printonedigitln ( 8 / 3 ); 		/* 小数点以下は余りは切り捨て */
	println ( "整数値 8 % 3 の出力" ); 
	printonedigitln ( 8 % 3 ); 		/* 余りは「%」をで計算 */
	println ( "整数値 8 - ( 8 / 3 ) * 3 の出力" ); 
	printonedigitln ( 8 - ( 8 / 3 ) * 3 ); 		/* 余りを求めるもう一つの方法 */
	return 0;
}
$ ./sample-014.exe $
Download : sample-015.c
/*
 * 2017/06/09 sample-015.c
 */
/*
 * extern 宣言
 */
extern void println ( char *string );
extern void printpositiveint ( int n );
extern void printpositiveintln ( int n );
/*
 * 整数
 */
int main ( int argc, char *argv[] ) {
	println ( "整数値 0 の出力" ); 
	printpositiveintln ( 0 );
	println ( "整数値 11 の出力" ); 
	printpositiveintln ( 11 );
	println ( "整数値 12345 の出力" ); 
	printpositiveintln ( 12345 );
	println ( "整数値 12 * 34 の出力" ); 
	printpositiveintln ( 12 * 34 );
	return 0;
}
$ ./sample-015.exe $
Download : sample-016.c
/*
 * 2017/06/09 sample-016.c
 */
#include <stdio.h>
/*
 * check_star_char
 */
void check_star_char ( char ch ) {
	if ( ch == '*' ) {		/* ch の中身が '*' かどうかをチェック */
	 	printf ( "これは「*」です\n" );
	} else {
	 	printf ( "これは「*」ではありません\n" );
	}
}
/*
 * main
 */
int main ( int argc, char *argv[] ) {
	check_star_char ( getchar() );	/* getchar() で文字を読込み、それを出力 */
	return 0;
}
A
$ ./sample-016.exe < sample-016.in A これは「*」ではありません $
/*
 * コマンドライン処理
 */
#include <stdio.h>
int main( int argc, char *argv[] ) {
	/*
		今まで、main 関数の引数は「void」としてきた
		実は、引数がある(「void」は実は。「ない」の意味 )
			int argc, char *argv[]
				という argc, と argv という二つの引数がある
					argc, argv という引数の名前は、好きにしてよい
					例:	int ac, char *av[]
						二つの引数の名前が違っていればよい
						ただ、名前以外の部分は固定
		!! main 関数にも引数がある
		!!	「引数」:関数を呼び出すときに、値を指定する事によって与える
		!!		引数の値は、呼び出し側が決める
		!!			main を呼び出すものって何 ?
		!!				「形式的(実際にも..)」コマンドを指定したときの
		!!					コマンドライン引数が渡されて、呼ばれる
		!!						!! main 関数も「呼ばれ」ている
		!!						!! 「呼ぶ側」も main を呼ぶ事にしている
		コマンドライン
			例:
			$ ./prog.exe abc efg
				         ^^^^^^^^ プログラムの実行時に
				         		プログラムの後ろに並べた文字列が
				         		main 関数の引数(コマンドライン引数)になる
				         		空白で区切って並べるので、二つある
		argc -- コマンドライン引数の個数 + 1
		argv -- argv[n] が n 番目(n=1 から始まる)の文字列
			例では、「"abc"」と「"efg"」の二つの引数が与えられる
				argc = 2+1 = 3
				argv[1] -- 最初引数なので「"abc"」という文字列
				argv[2] -- 二つ目の引数なので「"efg"」という文字列
				!! argv[0] -- コマンド名が入る
		コマンドライン引数は、いつでも、適切に指定されるとは
		限らない
			適切に指定されているか (せめて、引数の個数が正しいか) ?
			は、判断して、処理すべき。
	*/
	printf ( "argc = " );
	putchar ( '0' + argc );		/* 一けたの数値 */
	putchar ( '\n' );
	if ( argc > 2 ) {	/* argv[1], argv[2] が指定されている */
		/*
			入力(実行時に、プログラムの外から得られる情報)は、
			常に適切とは限らないので、
			入手(入力)直後に、それをチェックすべき
		*/
		printf ( "argv[1]=" );
		printf ( argv[1] );			/* argv[1] は文字列なので printf で出力できる */
		putchar ( '\n' );
		printf ( "argv[2]=" );
		printf ( argv[2] );
		putchar ( '\n' );
	} else {
		/* 不適切な情報が指定された場合は、エラーメッセージを出す */
		printf ( "コマンドライン引数を 2 つ以上、指定してください\n" );
	}
	printf ( "argv[0]=" );
	printf ( argv[0] );
	putchar ( '\n' );
	/* プログラムを実行する時に、引数として、データを
		プログラムに渡すことができる
	*/
	
	return 0;
}
/*
	p-003.c
		version : 1.0b
			関数 func と main 関数が同一のファイル内にある
*/
#include <stdio.h>
void func(void) {
	printf ( "呼び出される関数(修正版)\n" );
}
int main(void) {
	func();		/* 関数 func を呼び出す */
	func();
	return 0;
}
/*
	p-004-01.c
		version : 2.0
			関数 func と main 関数が
			別のファイル内にある
				main 関数は p-004.c
				func 関数は p-004-01.c
*/
#include <stdio.h>
void func(void) {
	printf ( "呼び出される関数(再修正版)\n" );
}
/*
	p-004.c
		version : 2.0
			関数 func と main 関数が
			別のファイル内にある
				main 関数は p-004.c
				func 関数は p-004-01.c
*/
#include <stdio.h>
int main(void) {
	func();		/* 関数 func を呼び出す */
	func();
	return 0;
}
/*
	p-005.c
		version : 3.0
			関数 func と main 関数が
			別のファイル内にある
				main 関数は p-005.c
					p-004.c とは違うふるまいをする
				func 関数は p-004-01.c
*/
#include <stdio.h>
int main(void) {
	func();		/* 関数 func を呼び出す */
	func();
	func();
	func();
	return 0;
}
/*
	p-006.c
		version : 1.5
			関数 func と main 関数が同一のファイル内にある
*/
#include <stdio.h>
void func(void) {
	printf ( "呼び出される関数(修正版)\n" );
}
int main(void) {
	func();		/* 関数 func を呼び出す */
	func();
	func();
	return 0;
}
make (makefile) と分割コンパイルの話 今までのプログラム 一つファイルの中に、 main 関数と main 関数から呼び出される、関数を、 一つのファイルに保存した 従来の手順 cc -c p-003.c -- コンパイル cc -o p-003.exe p-003.o -- リンク ./p-003.exe -- 実行 実は、分ける事もできる !! これまでも、printf は、他の場所にあった !! s_xxx.h も、関数の定義は、main 関数とは別 !! ライブラリは、基本、別ファイルに関数が定義されている 分けてみる main -> p-004.c func -> p-004-01.c 実行手順 cc -c p-004.c -- コンパイル cc -c p-004-01.c -- コンパイル すべての .c ファイルをコンパイルし、それぞれ .o を作る cc -o p-004.exe p-004.o p-004-01.o -- リンク リンクする時には、すべての .o を指定する必要がある ./p-004.exe -- 実行 分割コンパイル p-003.c -> p-004.c -> p-004.o ---> p-004.exe p-004-01.c -> p-004-01.o -+ 手間と安全性(バグがあったときに対応可能)がトレード この手間も減らしたい makefile で対応する 手間が増える !! (そんな損をして)何がうれしいか ? 分離した関数が再利用できる p-004.c をコピーして p-005.c (p-004.c 同じく、func 呼び出す が、呼び出し方が異なる ) を作る 実行手順 cc -c p-005.c -- コンパイル cc -o p-005.exe p-005.o p-004-01.o -- リンク リンクする時には、p-004-01.o には、関数 func の定義がコンパイル済 再利用できる ./p-005.exe -- 実行 p-006.c は、p-003.c (関数 func が同居)をコピーして、 main だけ変更する。 これでも、p-003.c の func が、 p-006.c で「再利用」されている と考えててもよさそう... もし、func を変更したくなったら.. ?? 特に、func に問題があって、すべての func を変更したい func : p-003.c, p-004-01.c p-006.c の三か所にある p-003.c ------------> p-003.o -> p-003.exe +-> p-004-01.c -> p-004-01.o -> p-004.exe | -> p-005.exe +-> p-006.c ----> p-006.o ----> p-006.exe p-003.c p-006.c : func の内容をコピーした -> 変更は、両方に行う必要がある p-004.c p-005.c : func の内容を共有した -> 変更は、一か所で済む 手間をかける、結果的的にあとの手間を減らす 技術屋は、その手間をさらに、減らす事を考える make を使えば、手間が減らせる事が解っている == 先週の課題 20160602-01 高さ 3 のハノイの塔の問題を解く 1 2 3 --------- A B C | v 1 2 3 --------- A B C 動かせるのは、一度に一つ 一番上のものだけ 小さい円盤上には、大きな円盤はのせされない 1,2,3 の三つ円盤を A から B に移すという課題なので、 どこかで、A から B に 3 の円盤を動かす必要がある その時には A に 3 があり 3 の上には、何ない B にも何もない -> 1, 2 の円盤は C にある 3 を動かす前に、1,2 を A から C に動かす必要がある 同様に考えると、 2 を A から C に動かすときには、 1 は、B にある必要がある a) 1 を A から B 1 1 2 2 3 3 --------- --------- A B C A B C b) 2 を A から C 1 1 2 2 3 3 --------- --------- A B C A B C c) 1 を B から C 1 1 2 2 3 3 --------- --------- A B C A B C d) 3 を A から B 1 1 2 2 3 3 --------- --------- A B C A B C 後は、C にある 1, 2 を B に持ってくる これは、すでに、A にある 1, 2 を C に持っていった 経験があるので、それを生かせばよい a) 1 を A から B b) 2 を A から C c) 1 を B から C d) 3 を A から B 残りは、a,b,c を参照 先週の課題 20160602-02 高さ n のハノイの塔の問題を解く 手順を人間がやるのは大変なので、やってられない コンピュータに解かせよう [考え方] n=3 の時、 3 の円盤を動かすには、 まず、1,2 の円盤を、まずどかして 3 を動かしたから、 再び、1,2 の円盤を、 3 の上に乗せる -> 一般化 [1 - n-1] [1 - n-1] [ n ] [ n ] A B C x) [1 - n ] を A から B に移動 => a) [1 - n-1] を A から C に移動 b) [ n ] を A から B に移動 c) [1 - n-1] を C B に移動 x) のためには、a), b) の処で再帰呼び出しをすればよい == 問題を解くのに、数学的帰納法の考え方が利用されている 「hanoi(n) を解くために、hanoi(n-1) が利用されている」 この考えを直接、人間が考えて(計算して)手順を作る -> 課題 1 手順(計算結果)が分かったので、それをそのまま記述 考え方がわかれば、後は、計算機に考えて(計算して)手順も、計算機に屋良らセル -> 課題 2 考え方が分かった、考え方を記述した 再帰の「記述=帰納法の考え方を表現したもの」によって、手順が計算される
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20170609-01.c
/*
 * CDATE FILENAME
 *
 *	キーボードから一文字入力し、その文字によって異る国の挨拶をする
 */
#include <stdio.h>
/*
 * hello ( char contry )
 *	char contry : 国を表す一文字
 *		j : 日本
 *		e : 英語
 *		c : 中国
 *		f : フランス語
 *		g : ドイツ語
 */
void hello ( char cmd ) {
	if ( cmd == 'j' ) {				/* 'j' の時は、日本語にする */
		printf ( "こんにちは\n" );
	} else if ( cmd == 'e' )	{	/* 'e' の時は、英語にする */
	/*
	**	 この部分を完成させなさい
	*/
	} else if ( cmd == 'c' )	{	/* 'c' の時は、中国語にする */
		printf ( "ニイハオ\n" );
	} else if ( cmd == 'f' )	{	/* 'f' の時は、フランス語にする */
		printf ( "Bonjour\n" );
	/*
	**	 この部分を完成させなさい
	*/
		printf ( "Guten tag\n" );
	} else {						/* どれでもなければ.. */
		printf ( "???\n" );
	}
}
/*
 *	main
 */
int main( void )
{
	printf ( "国を表す文字を入力してください\n" );
	printf ( "\tj\t日本\n" );
	printf ( "\te\t英語\n" );
	printf ( "\tc\t中国\n" );
	printf ( "\tf\tフランス\n" );
	printf ( "\tg\tドイツ\n" );
	hello ( getchar() );	/* getchar() で文字を入力し、それに対応する結果を出す */
	 return 0;
}
f
C:\usr\c\> 20140523-01-QQQQ 国を表す文字を入力してください j 日本 e 英語 c 中国 f フランス g ドイツ f Bonjour C:\usr\c\>
Download : 20170609-02.c
/*
 * CDATE FILENAME
 *
 *	キーボードから一行(改行まで..)文字列を読込み、それを逆順に出す
 */
#include <stdio.h>
/*
 * reverse ( char contry )
 *	char cmd : どのメッセージにするかを表す文字
 *		
 */
void reverse_line ( char ch ) {
	if ( ch == '\n' )	{			/* 改行ならば.. */
		/* なにもしなくてよい */
	} else {						/* そうでなければ.. */
	/*
	**	 この部分を完成させなさい
	*/
	}
}
/*
 *	main
 */
int main( void )
{
	reverse_line ( getchar() );	/* 最初の文字を読み込んで .. */
	putchar ( '\n' );			/* 改行を出力 */
	return 0;
}
abc123
C:\usr\c\> 20140523-02-QQQQ abc123 321cba C:\usr\c\>