Download : sample-001.c
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *	変更前
 */
#include <stdio.h>
int main ( void ) {
	printf ( "こんにちは、田中さん\n" );
	printf ( "田中さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
	printf ( "こんにちは、鈴木さん\n" );
	printf ( "鈴木さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
	return 0;
}
$ ./sample-001.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-002.c
/*
 * 2020/05/08 sample-002.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 * 関数化
 */
#include <stdio.h>
void hello_tanaka(void) {
	printf ( "こんにちは、田中さん\n" );
	printf ( "田中さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
void hello_suzuki(void) {
	printf ( "こんにちは、鈴木さん\n" );
	printf ( "鈴木さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	hello_tanaka();
	hello_suzuki();
	return 0;
}
$ ./sample-002.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-003.c
/*
 * 2020/05/08 sample-003.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *	共通部分を繰り出すために、プログラムを変形 (リファクタリング)
 *		リファクタリング
 *			プログラムの「振舞」を変更しない範囲で、「表現」を変更
 *				=> 「関数化」等をしやすいように書き換える
 *					=> 「理解しやすさ」を高める事が目的
 */
#include <stdio.h>
void hello_tanaka(void) {
	printf ( "こんにちは、" );
	printf ( "田中" );				/* 異る部分("田中")を分離 */
	printf ( "さん\n" );
	printf ( "田中" );				/* 「文字列」の部分しか分離できない.. */
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
void hello_suzuki(void) {
	printf ( "こんにちは、" );
	printf ( "鈴木" );				/* 異る部分("鈴木")を分離 */
	printf ( "さん\n" );
	printf ( "鈴木" );
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	hello_tanaka();
	hello_suzuki();
  return 0;
}
$ ./sample-003.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-004.c
/*
 * 2020/05/08 sample-004.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 * 	共通部分を変数化する事により、抽象化(引数付き関数)
 */
#include <stdio.h>
void hello_YOU( char *YOU ) {	/* 変数(YOU)の宣言 (仮引数宣言) */
	printf ( "こんにちは、" );
	printf ( YOU );				/* 異る部分は、変数(YOU)として抽象化 */
	printf ( "さん\n" );
	printf ( YOU );				/* 異る部分は、変数(YOU)として抽象化 */
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	hello_YOU ( "田中" );		/* 変数(YOU)の値を指定 (実引数の指定) */
	hello_YOU ( "鈴木" );		/* 変数(YOU)の値を指定 (実引数の指定) */
	return 0;
}
$ ./sample-004.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-005.c
/*
 * 2020/05/08 sample-005.c
 */
#include <stdio.h>
/*
 * 「金糸雀(かなりや)」
 *  (c) 西條八十作詞・成田為三作曲
 *	http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
 */
int main ( void ) {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "後の山に 棄てましょか\n" );
  printf ( "いえ いえ それはなりませぬ\n" );
  printf ( "\n" );
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "背戸の小薮に 埋けましょか\n" );
  printf ( "いえ いえ それはなりませぬ\n" );
  printf ( "\n" );
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "柳の鞭で ぶちましょか\n" );
  printf ( "いえ いえ それはかわいそう\n" );
  printf ( "\n" );
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "象牙の船に 銀の櫂\n" );
  printf ( "月夜の海に 浮べれば\n" );
  printf ( "忘れた唄を おもいだす\n" );
  return 0;
}
$ ./sample-005.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはかわいそう 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-006.c
/*
 * 2020/05/08 sample-006.c
 */
#include <stdio.h>
/*
 * 「金糸雀(かなりや)」
 *  (c) 西條八十作詞・成田為三作曲
 *	http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
 */
/*
 * まず、四つの歌にわける
 */
void kyoku_1() {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "後の山に 棄てましょか\n" );
  printf ( "いえ いえ それはなりませぬ\n" );
}
void kyoku_2() {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "背戸の小薮に 埋けましょか\n" );
  printf ( "いえ いえ それはなりませぬ\n" );
}
void kyoku_3() {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "柳の鞭で ぶちましょか\n" );
  printf ( "いえ いえ それはなりませぬ\n" );
}
void kyoku_4() {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
  printf ( "象牙の船に 銀の櫂\n" );
  printf ( "月夜の海に 浮べれば\n" );
  printf ( "忘れた唄を おもいだす\n" );
}
int main ( void ) {
  kyoku_1();
  printf ( "\n" );
  kyoku_2();
  printf ( "\n" );
  kyoku_3();
  printf ( "\n" );
  kyoku_4();
  return 0;
}
$ ./sample-006.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-007.c
/*
 * 2020/05/08 sample-007.c
 */
#include <stdio.h>
/*
 * 「金糸雀(かなりや)」
 *  (c) 西條八十作詞・成田為三作曲
 *	http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
 */
/*
 * 更に、共通する部分を抜き出す
 */
void uta() {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
}
void ieie() {
  printf ( "いえ いえ それはなりませぬ\n" );
}
void kyoku_1() {
  uta();
  printf ( "後の山に 棄てましょか\n" );
  ieie();
}
void kyoku_2() {
  uta();
  printf ( "背戸の小薮に 埋けましょか\n" );
  ieie();
}
void kyoku_3() {
  uta();
  printf ( "柳の鞭で ぶちましょか\n" );
  ieie();
}
void kyoku_4() {
  uta();
  printf ( "象牙の船に 銀の櫂\n" );
  printf ( "月夜の海に 浮べれば\n" );
  printf ( "忘れた唄を おもいだす\n" );
}
int main ( void ) {
  kyoku_1();
  printf ( "\n" );
  kyoku_2();
  printf ( "\n" );
  kyoku_3();
  printf ( "\n" );
  kyoku_4();
  return 0;
}
$ ./sample-007.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-008.c
/*
 * 2020/05/08 sample-008.c
 */
#include <stdio.h>
/*
 * 「金糸雀(かなりや)」
 *  (c) 西條八十作詞・成田為三作曲
 *	http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
 */
/*
 * 1 〜 3 を引数付き関数でおきかえる
 */
void uta() {
  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
}
void ieie() {
  printf ( "いえ いえ それはなりませぬ\n" );
}
void kyoku_123 ( char *center ) {
  if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) {
  /* 4 */
  uta();
  printf ( "象牙の船に 銀の櫂\n" );
  printf ( "月夜の海に 浮べれば\n" );
  printf ( "忘れた唄を おもいだす\n" );
  } else {
  /* 1, 2, 3 */
  uta();
  printf ( center );
  ieie();
  }
}
void kyoku_1() {
  kyoku_123 ( "後の山に 棄てましょか\n" );
}
void kyoku_2() {
  kyoku_123 ( "背戸の小薮に 埋けましょか\n" );
}
void kyoku_3() {
  kyoku_123 ( "柳の鞭で ぶちましょか\n" );
}
void kyoku_4() {
  /*
  uta();
  printf ( "象牙の船に 銀の櫂\n" );
  printf ( "月夜の海に 浮べれば\n" );
  printf ( "忘れた唄を おもいだす\n" );
  */
  kyoku_123 ( "象牙の船に 銀の櫂\n" );
}
int main ( void ) {
  kyoku_1();
  printf ( "\n" );
  kyoku_2();
  printf ( "\n" );
  kyoku_3();
  printf ( "\n" );
  kyoku_4();
  return 0;
}
$ ./sample-008.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-009-01.c
 /*
 * 2020/05/08 sample-009-01.c
 */
/*
 * 関数 hello_YOU を分離
 */
#include <stdio.h>
void hello_YOU( char *YOU ) {	/* 変数(YOU)の宣言 (仮引数宣言) */
	printf ( "こんにちは、" );
	printf ( YOU );				/* 異る部分は、変数(YOU)として抽象化 */
	printf ( "さん\n" );
	printf ( YOU );				/* 異る部分は、変数(YOU)として抽象化 */
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
Download : sample-009.c
 /*
 * 2020/05/08 sample-009.c
 */
/*
 * 関数 hello_YOU を利用
 */
extern void hello_YOUp( char *YOU );	/* extern 宣言 */
int main ( void ) {
	hello_YOU ( "田中" );		/* 変数(YOU)の値を指定 (実引数の指定) */
	hello_YOU ( "鈴木" );		/* 変数(YOU)の値を指定 (実引数の指定) */
	return 0;
}
$ ./sample-009.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
/*
 * 20200508-01-QQQQ.c
 *	引数で指定された名前に、三度、「こんにちは」をする関数の作成
 */
#include <stdio.h>
/*
 * hello ( char *name )
 *	引数で指定された名前(name)に、一度、「こんにちは」をする関数
 */
void hello ( char *name ) {
	 printf ( "こんにちは" );
	 printf ( name );
	 printf ( "さん\n" );
}
/*
 * hello_three_times ( char *name )
 *	引数で指定された名前(name)に、三度、「こんにちは」をする関数
 */
void hello_three_times ( char *name ) {
	/* 挨拶を三度行う */
	 hello ( name );		/* 一度、挨拶をする */
	 hello ( name );		/* 一度、挨拶をする */
	 hello ( name );		/* 一度、挨拶をする */
}
/*
 * main
 */
int main ( void ) {
	/* 田中さんに三度挨拶 */
	hello_three_times ( "田中" );	/* 三回挨拶 */
	/* 鈴木さんに三度挨拶 */
	hello_three_times ( "鈴木" );	/* 三回挨拶 */
  return 0;
}
#include <stdio.h>
int main(void) {
	printf ( "Hello, World\n" ); /* 画面に「Hello, World」[改行]を表示 */
								/* 命令 */
	return 0;
}
#include <stdio.h>
int main(void) {
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	return 0;
}
#include <stdio.h>
int main(void) {
	printf ( "1. Hello, World\n" );	/* 命令 */
	printf ( "2. Hello, World\n" );	/* 命令 */
	printf ( "3. Hello, World\n" );	/* 命令 */
	return 0;
}
#include <stdio.h>
/*
	100 回数 Hello, World を出力
*/
void hello_50_times(void) {
	/* 50 行に hello_50_times という名前をつけた */
	/*	C 言語での「名前」は、「英字から始まり、英字、数字、_からなる文字並び」 */
	/* 関数定義 ( hello_50_times を定義し、その内容が 50 行) */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
	printf ( "Hello, World\n" );	/* 命令 */
}
int main(void) {
	hello_50_times();		/* 関数 hello_50_times を呼び出す */
	hello_50_times();		/* 関数 hello_50_times を呼び出す */
	hello_50_times();		/* 関数 hello_50_times を呼び出す */
	return 0;
}
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *		二つの関数を作る
 */
#include <stdio.h>
/*
	全体の 6 行を 3 行 + 3 行に分ける
		hello_tanaka
		hello_suzuki
*/
void hello_tanaka(void) {
	printf ( "こんにちは、田中さん\n" );
	printf ( "田中さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
void hello_suzuki(void) {
	printf ( "こんにちは、鈴木さん\n" );
	printf ( "鈴木さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	hello_tanaka();
	hello_suzuki();
	return 0;
}
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *		二つの関数を作る
 */
#include <stdio.h>
/*
	この二つの関数をまとめて、一つの引数付き関数にしたい
		=> 異なる部分を「変数」にする
	<準備>
		異なる部分が「際立つ(独立)」になるように書き換える
			=> プログラムの内容(実行結果)は変えずに表現だけを変える
				リファクタリング
					プログラムの表現を、扱いやすいように整理する事が目的
						=> 引数付き関数を作りやすいようにする
*/
void hello_tanaka(void) {
	/* printf ( "こんにちは、鈴木さん\n" ); */
	printf ( "こんにちは、" );
	printf ( "田中" );
	printf ( "さん\n" );
	/*	printf ( "田中さんは、元気していましたか ?\n" );	*/
	printf ( "田中" );
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
void hello_suzuki(void) {
	printf ( "こんにちは、" );
	printf ( "鈴木" );
	printf ( "さん\n" );
	printf ( "鈴木" );
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	hello_tanaka();
	hello_suzuki();
	return 0;
}
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *		二つの関数を作る
 */
#include <stdio.h>
/*
	この二つの関数をまとめて、一つの引数付き関数にしたい
		=> 異なる部分を「変数」にする
	異なる部分を変数して、
		一つの統合した、関数にしてしまう
			hello_YOU
		異なる部分を変数に置き換える
			変数名として YOU 
		関数名の後ろの「(void)」に、(void を削って) 変数名を入れる
			変数名の前に「char *」をいれる
*/
void hello_YOU(char *YOU) {
	printf ( "こんにちは、" );
	printf ( YOU );				/* "田中"/"鈴木" => YOU */
	printf ( "さん\n" );
	printf ( YOU );
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	/* hello_tanaka(); */
	hello_YOU( "田中" );	/* 引数付き関数を呼び出す場合は */
							/* 実引数(引数付き関数内の変数の値を指定する)が必要 */
	/* hello_suzuki(); */
	hello_YOU( "鈴木" );
	hello_YOU( "栗野" );	/* 実引数を色々変えれば色々な事が可能 */
							/* 引数付き関数にすることにより、汎用な関数が作れる */
		/* 挙動 */
		/*	1. hello_YOU ( "栗野" );	*/
		/*		関数名 hello_YOU が探される */
		/*	2.
				"栗野" => YOU		実引数と仮引数の対応付けがおきる
			=>	printf ( "こんにちは、" );
				printf ( YOU );
				printf ( "さん\n" );
				printf ( YOU );
				printf ( "さんは、元気していましたか ?\n" );
				printf ( "また、一緒に働きましょうか ?\n" );
		*/
		/*	3.
				"栗野" => YOU		実引数と仮引数の対応付けがおきる
			=>	printf ( "こんにちは、" );
				printf ( "栗野" );
				printf ( "さん\n" );
				printf ( "栗野" );
				printf ( "さんは、元気していましたか ?\n" );
				printf ( "また、一緒に働きましょうか ?\n" );
		*/
		/*	4.
			=>	printf ( "こんにちは、" );
				printf ( "栗野" );
				printf ( "さん\n" );
				printf ( "栗野" );
				printf ( "さんは、元気していましたか ?\n" );
				printf ( "また、一緒に働きましょうか ?\n" );
			=>
				こんにちは、栗野さん
				栗野さんは、元気していましたか ?
				また、一緒に働きましょうか ?
		*/
	return 0;
}
/*
	関数定義		f(x)=x*x		関数 f(x) の定義
	関数呼び出し	f(3)
					1. f が探される
					2. 関数 f(x)の定義から
						3 -> x
						x*x
					3.
						3*3
					=>
						9
*/
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *		二つの関数を作る
 */
#include <stdio.h>
void hello_YOU(char *YOU) {
	printf ( "こんにちは、" );
	printf ( YOU );				/* "田中"/"鈴木" => YOU */
	printf ( "さん\n" );
	printf ( YOU );
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
int main ( void ) {
	hello_YOU( "田中" );
	hello_YOU( "鈴木" );
	hello_YOU( "栗野" );
	return 0;
}
/*
 * 2020/05/08 p-009-01.c
 */
/*
 * main はなく、関数 hello_YOU だけが定義さている
 */
#include <stdio.h>
void hello_YOU(char *YOU) {
	printf ( "こんにちは、" );
	printf ( YOU );				/* "田中"/"鈴木" => YOU */
	printf ( "さん\n" );
	printf ( YOU );
	printf ( "さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
}
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *		二つの関数を作る
 */
#include <stdio.h>
/*
 * main 関数だけある
 */
extern void hello_YOU(char *YOU);
	/* 関数 hello_YOU の extern (外部参照) 宣言 */
	/*	関数 hello_YOU は、別の C ファイルで定義されている */
	/*	その形は、上記の「プロトタイプ宣言」の形をしている */
int main ( void ) {
	hello_YOU( "田中" );
	hello_YOU( "鈴木" );
	hello_YOU( "栗野" );
	return 0;
}
/*
 * 2020/05/08 p-010.c
 */
#include <stdio.h>
/*
 * main 関数だけある
 */
extern void hello_YOU(char *YOU);
/*
	p-009-01.c で定義され、コンパイルされた p-009-01.o に入っている
	関数 hello_YOUは、
		p-009.exe でも利用できる
	し、同じく
		p-010.exe でも利用できる
	=>
		p-009-01.o の中の関数 hello_YOU が、
			二つのプログラム p-009.exe と p-010.exe で共有できる
				=> 分割コンパイルしたおかげ
					p-008.c -> p-009.c と「分割」したので
						hello_YOU を単独で、再利用できた
		!!! 関数を再利用するには、
		!!!		main 関数を切り離す必要がある
		!!!			=> 別の main との組み合わせが可能
*/
int main ( void ) {
	hello_YOU( "日大" );
	hello_YOU( "理工" );
	hello_YOU( "数学" );
	return 0;
}
/*
 * 2020/05/08 sample-001.c
 */
/*
 * 似た表現の繰返しのあるプログラムを複数に分割する
 *	変更前
 */
#include <stdio.h>
int main ( void ) {
	printf ( "こんにちは、田中さん\n" );
	printf ( "田中さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
	printf ( "こんにちは、鈴木さん\n" );
	printf ( "鈴木さんは、元気していましたか ?\n" );
	printf ( "また、一緒に働きましょうか ?\n" );
	return 0;
}
前回(2020/05/01)の内容 プログラムとは 計算機への指示(作業手順)を記述したもの 「命令」を並べたもの これらの命令が、順に実行される !! コンピュータの操作 !! コンピュータに一々指示を出す !! コンピュータは、指示が出されるために何かをする !! <= コンピュータにまとまった何かをさせる !! => 人間がついている必要がある !! コンピュータを使っている間 !! 他のことができない !! 指示をまとめて出して、それを一気に実行できる !! コンピュータが仕事をしている(プログラムを実行している)間 !! 他の作業ができる プログラムの表現方法 人間が書く => 人間が書きやすいことが望ましい コンピュータが実行(読む) => コンピュータの都合に合わせること望ましい この二つの立場の矛盾を解決するために プログラミング言語 人間向きのプログラムの表現方法 コンパイル(翻訳)をすることにより コンピュータ向きのプログラムに変換可能なもの コンパイルとは 人間に判り易い形式(C 言語)から計算機が実行できる形(機械語)に変換する C 言語 この講義で学ぶ、プログラミング言語の名前 ちょっと古い言語 今の新しい言語の元となる言語(共通/基礎) 色々な表現を学ぶ 一年を通して、C 言語を一通り学ぶ printf : メッセージを出力する関数 順接 : 「命令」を並べると、その並べた「順」に命令が実行される 「命令の実行順序」を決めている 関数 : 「幾つかの命令列」に「名前を付けたもの」 関数の定義 : 命令列に名前を付ける 命令列 => 複雑なものに「名前」という単純なものを対応させる 関数の呼び出し : 名前を使って、命令列を呼び出す 「名前」を利用するだけで(複雑かもしれない)命令列がよびだせる 演習 コンパイルの仕方を覚える プログラムを書いてみよう Hello, World 単純で完全なプログラム プログラム作成の出発点 プログラムを少し変えては、実行して確認をする # 差分的プログラミング 命令(関数呼び出し)を並べてみよう(順接) 関数を作ってみよう(命令に名前を付ける) == 引数付き関数 関数本体の一部を「変数(へんすう)」にしたもの 「変数」具体的な値を割り当てられるもの => 値が割り当てられていない場合は、無意味 変数(割り当てによって、値が変化する「変わる数」)を含む命令 値が定まっていないとそのままでは実行できない 例 : 英語 S V S 主語 => I V 動詞 => stand S V => I stand. S 主語 => You V 動詞 => stand S V => You stand. 「変数」の内容を、後(実行時)に決める事により、振舞を変更できる (引数を持たない関数に比較して) より「抽象的な」関数 引数(ひきすう):引数付き関数に現れる「変数」 <数学> 関数定義 : f(x)=x*x ^ 仮引数 関数適用 : f(3)=3*3=9 ^ 実引数 <C 言語> 仮引数(かりひきすう) : 関数の本体に現れる「変数」の宣言 (関数定義) 実引数(じつひきすう) : 「変数」の内容 (関数呼出し) 引数付き関数の効用 (本質的には「再利用[コピペ]」が目的) f3 = 3*3 f2 = 2*2 y = f3 + f2 f(x) = x*x y = f(3)+f(2) // 関数 f(x) の定義が再利用されている 一つの関数定義で(実引数の値を変更する事により..) (本体に含まれる変数(仮引数)値が異なるので異なる)複数の関数として利用できる make 最初に make をインストールする sudo apt install make パスワードは「soft」といれる
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20200508-01.c
/*
 * 20200508-01-QQQQ.c
 *	引数で指定された名前に、三度、「こんにちは」をする関数の作成
 */
#include <stdio.h>
/*
 * hello ( char *name )
 *	引数で指定された名前(name)に、一度、「こんにちは」をする関数
 */
void hello ( char *name ) {
	 printf ( "こんにちは" );
	/*
	**	 この部分を完成させなさい
	*/
}
/*
 * hello_three_times ( char *name )
 *	引数で指定された名前(name)に、三度、「こんにちは」をする関数
 */
void hello_three_times ( char *name ) {
	/* 挨拶を三度行う */
	 hello ( name );
	/*
	**	 この部分を完成させなさい
	*/
}
/*
 * main
 */
int main ( void ) {
	/* 田中さんに三度挨拶 */
	hello_three_times ( "田中" );
	/* 鈴木さんに三度挨拶 */
	/*
	**	 この部分を完成させなさい
	*/
  return 0;
}
$ ./20200508-01-QQQQ.exe こんにちは田中さん こんにちは田中さん こんにちは田中さん こんにちは鈴木さん こんにちは鈴木さん こんにちは鈴木さん $
Download : 20200508-02.c
/*
 * 20200508-02-QQQQ.c
 *	歌詞を出力する
 */
#include <stdio.h>
/*
 * 「一番星みつけた」
 *	(C) 生沼勝作詞(注)・信時潔作曲/文部省唱歌(一年)
 *	http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/ichibanboshi.html
 */
void uta ( char *ichi, char *basyo, char *ki ) {
	printf ( ichi );
	printf ( "番星みつけた。\n" );
	/*
	**	 この部分を完成させなさい
	*/
	printf ( ki );
	printf ( "の木のうえに。\n" );
}
void itibanboshi() {
	uta ( "一", "森", "杉" );
	printf ( "\n" );
	/*
	**	 この部分を完成させなさい
	*/
}
/*
 * main
 */
int main ( void ) {
  itibanboshi();
  return 0;
}
$ ./20200508-02-QQQQ.exe 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 $