Powered by SmartDoc

ソフトウェア概論A/B (2021/04/23)
Ver. 1.0

2021年4月23日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2021/soft/soft.html
ソフトウェア概論 A/B2021年4月23日 の資料

目次

講義資料

当日の OHP 資料

講義で利用するサンプルプログラム

Download : sample-001.c

sample-001.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-001.exe
こんにちは、田中さん
田中さんは、元気していましたか ?
また、一緒に働きましょうか ?
こんにちは、鈴木さん
鈴木さんは、元気していましたか ?
また、一緒に働きましょうか ?
$ 

Download : sample-002.c

sample-002.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-002.exe
こんにちは、田中さん
田中さんは、元気していましたか ?
また、一緒に働きましょうか ?
こんにちは、鈴木さん
鈴木さんは、元気していましたか ?
また、一緒に働きましょうか ?
$ 

Download : sample-003.c

sample-003.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-003.exe
こんにちは、田中さん
田中さんは、元気していましたか ?
また、一緒に働きましょうか ?
こんにちは、鈴木さん
鈴木さんは、元気していましたか ?
また、一緒に働きましょうか ?
$ 

Download : sample-004.c

sample-004.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-004.exe
こんにちは、田中さん
田中さんは、元気していましたか ?
また、一緒に働きましょうか ?
こんにちは、鈴木さん
鈴木さんは、元気していましたか ?
また、一緒に働きましょうか ?
$ 

Download : sample-005.c

sample-005.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-005.exe
唄を忘れた 金糸雀(かなりや)は
後の山に 棄てましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
背戸の小薮に 埋けましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
柳の鞭で ぶちましょか
いえ いえ それはかわいそう

唄を忘れた 金糸雀(かなりや)は
象牙の船に 銀の櫂
月夜の海に 浮べれば
忘れた唄を おもいだす
$ 

Download : sample-006.c

sample-006.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-006.exe
唄を忘れた 金糸雀(かなりや)は
後の山に 棄てましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
背戸の小薮に 埋けましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
柳の鞭で ぶちましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
象牙の船に 銀の櫂
月夜の海に 浮べれば
忘れた唄を おもいだす
$ 

Download : sample-007.c

sample-007.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-007.exe
唄を忘れた 金糸雀(かなりや)は
後の山に 棄てましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
背戸の小薮に 埋けましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
柳の鞭で ぶちましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
象牙の船に 銀の櫂
月夜の海に 浮べれば
忘れた唄を おもいだす
$ 

Download : sample-008.c

sample-008.c
/*
 * 2021/04/23 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.c の実行結果
$ ./sample-008.exe
唄を忘れた 金糸雀(かなりや)は
後の山に 棄てましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
背戸の小薮に 埋けましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
柳の鞭で ぶちましょか
いえ いえ それはなりませぬ

唄を忘れた 金糸雀(かなりや)は
象牙の船に 銀の櫂
月夜の海に 浮べれば
忘れた唄を おもいだす
$ 

Download : sample-009-01.c

sample-009-01.c
 /*
 * CDATE 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

sample-009.c
 /*
 * 2021/04/23 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.c の実行結果
$ ./sample-009.exe
こんにちは、田中さん
田中さんは、元気していましたか ?
また、一緒に働きましょうか ?
こんにちは、鈴木さん
鈴木さんは、元気していましたか ?
また、一緒に働きましょうか ?
$ 

講議中に作成したプログラム

本日の課題

課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。

課題 20210423-01 : 引数で指定された名前に、三度、「こんにちは」をする関数の作成

Download : 20210423-01.c

20210423-01.c
/*
 * 20210423-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;
}
20210423-01.c の実行結果
$ ./20210423-01-QQQQ.exe
こんにちは田中さん
こんにちは田中さん
こんにちは田中さん
こんにちは鈴木さん
こんにちは鈴木さん
こんにちは鈴木さん
$ 

課題 20210423-02 : 童謡の歌詞を出力するプログラムを作成しなさい

Download : 20210423-02.c

20210423-02.c
/*
 * 20210423-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;
}
20210423-02.c の実行結果
$ ./20210423-02-QQQQ.exe
一番星みつけた。
あれあの森の
杉の木のうえに。

二番星みつけた。
あれあのどての
柳の木のうえに。

三番星みつけた。
あれあの山の
松の木のうえに。
$