Powered by SmartDoc

ソフトウェア概論A (2012/04/20)
Ver. 1.2

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加資料

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2012/04/27 sample-001.c
 */

/*
 * 長いプログラムを複数に分割する
 * 	変更前
 */

#include <stdio.h>

int main ( void ) {

  /* 16 回同じ亊をする */

  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" );

  return 0;
}
sample-001.c の実行結果
C:\usr\c\>sample-001
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2012/04/27 sample-002.c
 */

/*
 * 長いプログラムを複数に分割する
 * 	変更後
 */

#include <stdio.h>

void fourTimes() {
  printf ( "Hello, World\n" );
  printf ( "Hello, World\n" );
  printf ( "Hello, World\n" );
  printf ( "Hello, World\n" );
}

int main ( void ) {

  /* 16 回 = 4 × 4 回同じ亊をする */

  fourTimes();
  fourTimes();
  fourTimes();
  fourTimes();

  return 0;
}
sample-002.c の実行結果
C:\usr\c\>sample-002
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2012/04/27 sample-003.c
 */

/*
 * 長いプログラムを複数に分割する
 * 	変更後
 */

#include <stdio.h>

void fourTimes() {
  printf ( "Hello, World\n" );
  printf ( "Hello, World\n" );
  printf ( "Hello, World\n" );
  printf ( "Hello, World\n" );
}

void fourFourTimes() {
  fourTimes();
  fourTimes();
  fourTimes();
  fourTimes();
}

int main ( void ) {

  /* 64 回 = 4 × 4 × 4 回同じ亊をする */

  fourFourTimes();
  fourFourTimes();
  fourFourTimes();
  fourFourTimes();

  return 0;
}
sample-003.c の実行結果
C:\usr\c\>sample-003
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2012/04/27 sample-004.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-004.c の実行結果
C:\usr\c\>sample-004
唄を忘れた 金糸雀(かなりや)は
後の山に 棄てましょか
いえ いえ それはなりませぬ

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

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

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

sample-005

Download : sample-005.c ( SJIS 版 )

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

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

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

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

sample-006

Download : sample-006.c ( SJIS 版 )

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

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

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

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

sample-007

Download : sample-007.c ( SJIS 版 )

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

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

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

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

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2012/04/27 sample-008.c
 */

#include <stdio.h>
#include <string.h>

/*
 * 「金糸雀(かなりや)」
 *  (c) 西條八十作詞・成田為三作曲
 *	http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
 */

/*
 * 4 の場合もまとめられないだろうか ?
 */

void uta() {

  printf ( "唄を忘れた 金糸雀(かなりや)は\n" );
}

void ieie() {

  printf ( "いえ いえ それはなりませぬ\n" );
}

/*
 * if と strcmp を使って処理できる
 */

void kyoku_123 ( char *center ) {

  uta();
  printf ( center );

  if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) {
	printf ( "月夜の海に 浮べれば\n" );
	printf ( "忘れた唄を おもいだす\n" );
  } else {
	  ieie();
  }
}

void kyoku_1() {

  kyoku_123 ( "後の山に 棄てましょか\n" );
}

void kyoku_2() {

  kyoku_123 ( "背戸の小薮に 埋けましょか\n" );
}

void kyoku_3() {

  kyoku_123 ( "柳の鞭で ぶちましょか\n" );
}

void kyoku_4() {

  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 の実行結果
C:\usr\c\>sample-008
唄を忘れた 金糸雀(かなりや)は
後の山に 棄てましょか
いえ いえ それはなりませぬ

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

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

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

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2012/04/27 sample-009.c
 */

#include <stdio.h>
#include <string.h>

/*
 * 木霊
 */

void echo ( char *message ) {

  if ( !strcmp ( message, "" ) ) { /* もし、メッセージが空っぽならば.. */
	printf ( "何か言わないと、言い返せないじゃないか.." );
  } else {			   /* そうじゃなければ、そのまま答える */
	printf ( message );
  }

}

void chat ( char *message ) {	/* こだまとお喋り */

  printf ( "呼掛け : " ); printf ( message ); printf ( "\n" );	/* 呼掛けの言葉 */
  printf ( "木霊   : " ); echo ( message );   printf ( "\n" );	/* 木霊の応答 */
}

/*
 * main
 */

int main ( void ) {

  chat ( "ヤッホー" );
  chat ( "オーイ" );
  chat ( "" );
  chat ( "生意気なやつだ" );

  return 0;
}
sample-009.c の実行結果
C:\usr\c\>sample-009
呼掛け : ヤッホー
木霊   : ヤッホー
呼掛け : オーイ
木霊   : オーイ
呼掛け : 
木霊   : 何か言わないと、言い返せないじゃないか..
呼掛け : 生意気なやつだ
木霊   : 生意気なやつだ
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2012/04/27 sample-010.c
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {

  printf ( "abcde\n" );		/* 当然 「abcde」が表示される.. */
  printf ( "abcde\n" + 1 );	/* 文字列に 1 を加えるってどうゆうこと.. ? */
  printf ( "abcde\n" + 2 );
printf ( "abcde\n" + 1 + 1 );	/* ("abcde\n" + 1) + 1 => "bcde\n" + 1 => \
    "cde\n" */

  return 0;
}
sample-010.c の実行結果
C:\usr\c\>sample-010
abcde
bcde
cde
cde
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2012/04/27 sample-011.c
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

void recursive ( char *string ) {

  if ( !strcmp ( string, "" ) ) {	/* もし空文字列 ( "" ) ならば */
	printf ( "" );			/* これで御仕舞い */
  } else {				/* そうでなければ、 */
	printf ( string );
	recursive ( string + 1 );	/* 再帰呼び出しする */
					/* +1 を忘れると悲惨な事に.. */
  }
}


int main ( void ) {

  recursive ( "abcdefg\n" );
  recursive ( "xyz\n" );

  return 0;
}
sample-011.c の実行結果
C:\usr\c\>sample-011
abcdefg
bcdefg
cdefg
defg
efg
fg
g

xyz
yz
z

C:\usr\c\> 

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2012/04/27 sample-013.c
 */

#include <stdio.h>
#include <string.h>

/*
 *
 */

void rec_hello ( char *count ) {

  if ( !strcmp ( count, "" ) ) {	/* カラッポなら.. */
	printf ( "Hello, World\n" );	/* 一つだけ表示してみる */
  } else {				/* そうでなければ.. */
	rec_hello ( count + 1 );	/* 二倍にして再帰よびだし */
	rec_hello ( count + 1 );
  }
}

/*
 *
 */

int main ( void ) {

  rec_hello ( "****" );	/* 2^4 = 16 回出力 */

  /* 2^10 = 1024 だから、 "**********" を与えれば... */

  return 0;
}
sample-012.c の実行結果
C:\usr\c\>sample-012
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
Hello, World
C:\usr\c\> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2012/04/27 sample-014.c
 */

#include <stdio.h>
#include <string.h>

/*
 *
 */

void fib ( char *n ) {

  if ( !strcmp ( n, "" ) ) {		/* カラッポ(0)なら.. */
	printf ( "*" );		/* 一つだけ : fib(0) = 1 だから */
   } else if ( !strcmp ( n, "*" ) ) {	/* 一つ(1)なら */
	printf ( "*" );		/* 一つだけ : fib(1) = 1 だから */
  } else {				/* そうでなければ.. */
	fib ( n + 1 );			/* fib ( n - 1 ) と */
	fib ( n + 2 );			/* fib ( n - 2 ) だけだす */
  }
}

/*
 *
 */

int main ( void ) {

  printf ( "fib 3 : " );
  fib ( "***" );
  printf ( "\n" );

  printf ( "fib 5 : " );
  fib ( "*****" ); 
  printf ( "\n" );

  return 0;
}
sample-013.c の実行結果
C:\usr\c\>sample-013
fib 3 : ***
fib 5 : ********
C:\usr\c\> 

本日の課題

課題 20120427-01

Download : 20120427-01.c ( SJIS 版 )

20120427-01.c
/*
 * 20120427-01-QQQQ.c
 *	「Hello, 自分の名前」を 1000 回以上出力するプログラム
 */

#include <stdio.h>

/*
 * sub
 */

void print1() {
  printf ( /* q:ここ */ );
}

void print2() {
  print1();
  print1();
}


	/*
	**	 この部分を完成させなさい
	*/


void print1024() {
  print512();
  print512();
}

/*
 * main
 */

int main ( void ) {

  print1024();

  return 0;
}
20120427-01.c の実行結果
C:\usr\c\>20120427-01-QQQQ
Hello 栗野
Hello 栗野
...
Hello 栗野
C:\usr\c\>

課題 20120427-02

Download : 20120427-02.c ( SJIS 版 )

20120427-02.c
/*
 * 20120427-02-QQQQ.c
 *	童謡(かえるのうた)を演奏するプログラム
 */

#include <stdio.h>
#include "s_midi.h"

/*
 * kaeru
 */

void kaeru() {

  /* カエルの歌 : http://homepage2.nifty.com/rit-k/Work1.htm
ドレミファミレド  ミファソラソファミ
ド ド ド ド   ドドレレミミファファミ レ ド
  */

  s_midi_length ( S_MIDI_LEN_4 );
  s_midi_play ( S_MIDI_C4 );	/* ド */
  s_midi_play ( S_MIDI_D4 );	/* レ */
  s_midi_play ( S_MIDI_E4 );	/* ミ */
  s_midi_play ( S_MIDI_F4 );	/* ファ */
  s_midi_play ( S_MIDI_E4 );	/* ミ */
  s_midi_play ( S_MIDI_D4 );	/* レ */
  s_midi_play ( S_MIDI_C4 );	/* ド */

  s_midi_play ( S_MIDI___ );	/* 休 */


	/*
	**	 この部分を完成させなさい
	*/


  s_midi_length ( S_MIDI_LEN_4 );
  s_midi_play ( S_MIDI_E4 );	/* ミ */
  s_midi_play ( S_MIDI_D4 );	/* レ */
  s_midi_play ( S_MIDI_C4 );	/* ド */


}

/*
 * main
 */

int main ( void ) {

  kaeru();

  return 0;
}
20120427-02.c の実行結果
C:\usr\c\>20120427-02-QQQQ
C:\usr\c\>

課題 20120427-03

Download : 20120427-03.c ( SJIS 版 )

20120427-03.c
/*
 * 20110506-3-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;
}
20120427-03.c の実行結果
C:\usr\c\>20120427-03-QQQQ
一番星みつけた。
あれあの森の
杉の木のうえに。

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

三番星みつけた。
あれあの山の
松の木のうえに。
C:\usr\c\>