Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加資料

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2012/05/11 sample-001.c
 */

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

/*
 * 亀プログラム
 *
 */

void move_ten(void) {	/* 10 歩進む */

  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
}

int main ( void ) {

  /*
   * 最初は真中 (0,0) で上をむいている
   */

  move_ten(); /* 二十歩前に足跡を残しながら進む (0,20) に移動する事になる */
  move_ten();

  s_turtle_turn(); /* 時計回りに 45 度を二回、すなわち 90 度向きを変えるので右を向く */
  s_turtle_turn();

  move_ten();/* 二十歩前に足跡を残しながら進む (20,20) に移動する事になる */
  move_ten();

  s_turtle_turn(); /* 下を向く */
  s_turtle_turn();

  move_ten(); /* (20,0) に行く */
  move_ten();

  s_turtle_turn(); /* 左を向く */
  s_turtle_turn();

  move_ten(); /* 元の (0,0) に戻った */
  move_ten();

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

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2012/05/11 sample-002.c
 */

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

/*
 * 亀プログラム
 *
 */

void jump_ten(void) {	/* 10 歩跳ねる */

  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
}

void move_ten(void) {	/* 10 歩進む */
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
}

void turn_90() {	/* 90 度向きをかえる */

  s_turtle_turn();
  s_turtle_turn();
}

void turn_270() {	/* 270 度向きをかえる */

  turn_90();
  turn_90();
  turn_90();

}

void move_and_turn() {	/* 20 歩進んで、向きを変える (四角形の辺を書く) */

  move_ten();
  move_ten();

  turn_90();
}

void draw_sqare() {	/* 一辺が 20 歩の四角形を作る */

 move_and_turn();
 move_and_turn();
 move_and_turn();
 move_and_turn();

}

int main ( void ) {

  /*
   * 最初は真中 (0,0) で上をむいている
   */

  draw_sqare(); /* まず四角を書く */

  turn_270();	/* 270 度回転 */
  jump_ten();	/* 10 歩跳ねる */

  draw_sqare(); /* また四角 */

  turn_270();
  jump_ten();

  draw_sqare();

  turn_270();
  jump_ten();

  draw_sqare();

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

sample-003

Download : sample-003.c ( SJIS 版 )

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

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

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

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

sample-004

Download : sample-004.c ( SJIS 版 )

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

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

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

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

sample-005

Download : sample-005.c ( SJIS 版 )

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

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

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

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

sample-006

Download : sample-006.c ( SJIS 版 )

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

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

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

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

sample-007

Download : sample-007.c ( SJIS 版 )

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

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

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

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

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2012/05/11 sample-008.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-008.c の実行結果
C:\usr\c\>sample-008
呼掛け : ヤッホー
木霊   : ヤッホー
呼掛け : オーイ
木霊   : オーイ
呼掛け : 
木霊   : 何か言わないと、言い返せないじゃないか..
呼掛け : 生意気なやつだ
木霊   : 生意気なやつだ
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2012/05/11 sample-009.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-009.c の実行結果
C:\usr\c\>sample-009
abcde
bcde
cde
cde
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2012/05/11 sample-010.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-010.c の実行結果
C:\usr\c\>sample-010
abcdefg
bcdefg
cdefg
defg
efg
fg
g

xyz
yz
z

C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2012/05/11 sample-011.c
 */

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

/*
 * 亀プログラム
 *
 */

void do_turtle ( char *program ) {

  if ( !strcmp ( program, "" ) ) {
	/* なにもしない */
  } else if ( !strncmp ( program, "m", 1 ) ) { /* move 命令 !! */
	s_turtle_move();
	do_turtle ( program + 1 );	/* 残り */
  } else if ( !strncmp ( program, "j", 1 ) ) { /* jump 命令 !! */
	s_turtle_jump();
	do_turtle ( program + 1 );	/* 残り */
  } else if ( !strncmp ( program, "t", 1 ) ) { /* turn 命令 !! */
	s_turtle_turn();
	do_turtle ( program + 1 );	/* 残り */
  } else {				/* その他 */
	/* なんだかわからないので無視する */
	do_turtle ( program + 1 );	/* 残り */
  }
}

/*
 *
 */

int main ( void ) {

  do_turtle ( "mmmmmttmmmmmttmmmmmttmmmmmtt" ); /* 四角をかく */

do_turtle ( "mmmmmmmmmmttmmmmmmmmmmttmmmmmmmmmmttmmmmmmmmmmtt" ); /* 四角をかく \
    */

  return 0;
}
sample-011.c の実行結果
C:\usr\c\>sample-011
C:\usr\c\> 

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2012/05/11 sample-012.c
 *	「Hello, 自分の名前」を 1000 回以上出力するプログラム
 */

#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/05/11 sample-013.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\> 

sample-a01

Download : sample-a01.c ( SJIS 版 )

sample-a01.c
/*
 * 2012/05/11 sample-a01.c
 *	引数付き関数
 */

#include <stdio.h>

/*
 *
 */

void kakko ( char *message ) {
  printf ( "「" );
  printf ( message );
  printf ( "」\n" );
}

/*
 *
 */

int main ( void ) {

  kakko ( "こんにちは" );
  kakko ( "さようなら" );

  return 0;
}
sample-a01.c の実行結果
C:\usr\c\>sample-a01
「こんにちは」
「さようなら」
C:\usr\c\> 

本日の課題

課題 20120511-01

Download : 20120511-01.c ( SJIS 版 )

20120511-01.c
/*
 * 20110513-01-QQQQ.c
 *	
 */

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

/*
 * sub
 */

void jump_ten(void) {	/* 10 歩跳ねる */

  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
  s_turtle_jump();
}

void move_ten(void) {	/* 10 歩進む */

  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
  s_turtle_move();
}

void turn_90() {	/* 90 度向きをかえる */

  s_turtle_turn();
  s_turtle_turn();
}

void small_square() {

  move_ten();
  turn_90();


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


}

void big_square() {

  move_ten();
  move_ten();
  move_ten();
  turn_90();


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


}

int main ( void ) {

  small_square();


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


  big_square();

  return 0;
}
20120511-01.c の実行結果
C:\usr\c\> 20120511-01
...
C:\usr\c\> 

課題 20120511-02

Download : 20120511-02.c ( SJIS 版 )

20120511-02.c
/*
 * 20110513-02-QQQQ.c
 *	引数付き関数で、if 文で条件判断をするプログラムを作成しなさい
 */

#include <stdio.h>
#include <strings.h>

/*
 * こだまでしょうか
 *	(c) 金子みすゞ
 *		http://www.ad-c.or.jp/campaign/self_area/03/index.html
 */

void kakko ( char *message ) {

    printf ( "「" );
    printf ( message );
    printf ( "」" );
}

void iu ( char *message ) {

	kakko ( message );

	printf ( "っていうと" );


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


}

/*
 * main
 */

int main ( void ) {

  iu ( "遊ぼう" );
  iu ( "馬鹿" );
  iu ( "もう遊ばない" );
  printf ( "そうして、あとでさみしくなって、\n" );
  iu ( "ごめんね" );
  printf ( "こだまでしょうか、いいえ、誰でも。\n" );

  return 0;
}
20120511-02.c の実行結果
C:\usr\c\> 20120511-02
「遊ぼう」っていうと「遊ぼう」っていう。
「馬鹿」っていうと「馬鹿」っていう。
「もう遊ばない」っていうと「遊ばない」っていう。
そうして、あとでさみしくなって、
「ごめんね」っていうと「ごめんね」っていう。
こだまでしょうか、いいえ、誰でも。
C:\usr\c\> 

課題 20120511-03

Download : 20120511-03.c ( SJIS 版 )

20120511-03.c
/*
 * 20110513-03-QQQQ.c
 *	底辺の長さが指定した文字列の二倍の長さ - 1 の横向のピラミッドを作成するプログラムを作成する
 */

#include <stdio.h>
#include <strings.h>

/*
*/

void down ( char *edge ) {

  if ( !strcmp ( edge, "" ) ) {
	/* なにもする必要はない */
  } else {
	printf ( edge );
	printf ( "\n" );

	down ( edge + 1 );
  }

}

void up ( char *edge ) {

  if ( !strcmp ( edge, "" ) ) {
	/* なにもする必要はない */
  } else {
	up ( edge + 1 );

	printf ( edge );
	printf ( "\n" );
  }
}

void pyramid ( char *edge ) {

	up ( edge + 1 );

	printf ( edge );
	printf ( "\n" );

	down ( edge + 1 );
}

/*
 * main
 */

int main ( void ) {

	pyramid ( "*****" );

	printf ( "\n" );

	pyramid ( "**********" );

  return 0;
}
20120511-03.c の実行結果
C:\usr\c\> 20120511-03
*
**
***
****
*****
****
***
**
*

*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*
C:\usr\c\>