Powered by SmartDoc

ソフトウェア概論A/B (2017/06/02)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

Download

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

Download : sample-001.c

sample-001.c
/*
 * 2017/06/02 sample-001.c
 */

/*
 * コマンドライン引数
 */

#include <stdio.h>

/*
 * main 関数
 */

int main ( int argc, char *argv[] ) {	/* main 関数の引数が変化 */
	/*
		main 関数の引数は、どちらでも良い
		「引数を宣言」する事により、「利用が可能」になる
	*/

	/*
		このプログラムを実行する場合は
			./sample-001.c.exe abc
		の様に、コマンド引数を指定する必要がある

		コマンドラインを指定しなかったりすると、
		エラー (core dumped) になったりする。
	*/

	printf ( "一つ目のコマンドライン引数は「" );
	printf ( argv[1] );
	printf ( "」でした。\n" );

	return 0;
}
sample-001.c の実行結果
$ ./sample-001.exe abc
一つ目のコマンドライン引数は「abc」でした。
$ 

Download : sample-002.c

sample-002.c
/*
 * 2017/06/02 sample-002.c
 */

/*
 * コマンドライン引数 (2)
 */

#include <stdio.h>

/*
 * main 関数
 */

int main ( int argc, char *argv[] ) {	/* main 関数の引数が変化 */
	/*
		このプログラムを実行する場合は
			./sample-002.c.exe abc 123 zzzzz
		の様に、コマンド引数を 2 つ以上、指定する必要がある
	*/

	printf ( "プログラムファイル名は「" );
	printf ( argv[0] );					/* argv[0] はプログラムファイル名 */
	printf ( "」でした。\n" );

	printf ( "一つ目のコマンドライン引数は「" );
	printf ( argv[1] );
	printf ( "」でした。\n" );

	printf ( "二つ目のコマンドライン引数は「" );
	printf ( argv[2] );
	printf ( "」でした。\n" );

	return 0;
}
sample-002.c の実行結果
$ ./sample-002.exe abc 123 zzzz
プログラムファイル名は「./sample-002.exe」でした。
一つ目のコマンドライン引数は「abc」でした。
二つ目のコマンドライン引数は「123」でした。
$ 

Download : sample-003.c

sample-003.c
/*
 * 2017/06/02 sample-003.c
 */

/*
 * 再起の利用
 */

#include <stdio.h>

/*
 * triangle ( N ) -- サイズ N の三角を作る
 */

void triangle ( char *N ) {

	if ( !strcmp ( N, "" ) ) {	/* サイズ 0 の時 */
		/* 何もしない */
	} else {					/* サイズが一般の N の時 */
		triangle ( N + 1 );		/* 文字列は 1 を加えると短かくなる */
								/* 再起呼び出し */
		printf ( N );			/* N を表示 */
		printf ( "\n" );		/* 改行 */
	}
}

/*
 * main 関数
 */

int main ( void ) {	/* main 関数の引数を利用しないので */

	triangle ( "***" );		/* サイズ 3 の三角 */

	printf ( "---\n" );		/* 仕切り */
	
	triangle ( "1234567" );		/* サイズ 7 の三角 */

	return 0;
}
sample-003.c の実行結果
$ ./sample-003.exe
*
**
***
---
7
67
567
4567
34567
234567
1234567
$ 

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

本日の課題

課題 20170602-01 : 高さ 3 のハノイを解く

Download : 20170602-01.c

20170602-01.c
/*
 * 20170602-01-QQQQ.c
 *	高さ3 のハノイの塔を手動で解く
 */


#include <stdio.h>

/*
 *	ハノイプログラムには、s_hanoi.h が必要
 */

#include "s_hanoi.h"

/*
 * ハノイの塔 プログラム
 */


int main ( void ) {

  /*
   * 最初は "1" に全ての円盤が置いてある
   * これを "2" に全ての円盤を移動する
   */

	/*
	 * ハノイで、できること
	 *	 s_hanoi_init() : ハノイプログラムの開始 : 最初に一度だけ呼び出す
	 *   s_hanoi_size ( char *discs ) : ハノイの塔の高さを設定する
	 *   s_hanoi_move ( char *from, char *to ) : from にある円盤を to に移す
	 *   s_hanoi_clear () : 最初の状態に戻す
	 *   s_hanoi_stop() : ハノイ塔プログラムの終了 : return 0 の前に呼び出す
	 */

	s_hanoi_init();	/* ハノイの塔のプログラムの初期変化 */
	/* s_hanoi_set ( char *discs ) を呼ばなければ、高さは 3 */

	printf ( "これから解答を開始します。[Enter] キーを押してください\n" );
	putchar ( '>' );
	putchar ( getchar() );	/* 開始前に、一旦停止 */

	/* 解答開始 */
	/* 高さが、具体的な小さい数(3)で指定されているので、
	   解答手順を実際に書き下すだけ */

	s_hanoi_move ( "1", "2" );	/* 1 から 2 に、(大きさ 1 の)円盤を移動 */
	s_hanoi_move ( "1", "3" );	/* 1 から 3 に、(大きさ 2 の)円盤を移動 */

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

	s_hanoi_move ( "1", "2" );	/* 1 から 2 に、(大きさ 3 の)円盤を移動 */
	s_hanoi_move ( "3", "1" );	/* 3 から 1 に、(大きさ 1 の)円盤を移動 */

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

	s_hanoi_move ( "1", "2" );	/* 1 から 2 に、(大きさ 1 の)円盤を移動 */

	/* 解答終了 */

	printf ( "プログラムを終了するには [Enter] キーを押してください\n" );
	putchar ( '>' );		/* 終了前に確認 */
	putchar ( getchar() );

	/* ハノイの終了 */
	s_hanoi_stop();

	return 0;
}
20170602-01.c の実行結果
$ ./20170602-01-QQQQ.exe
これから解答を開始します。[Enter] キーを押してください
>
プログラムを終了するには [Enter] キーを押してください
>
$ 

課題 20170602-02 : コマンドライン引数で指定した高さのハノイを解く

Download : 20170602-02.c

20170602-02.c
/*
 * DATE-02-QQQQ.c
 *	コマンドライン引数で指定した長さのハノイの塔を解く
 */


#include <stdio.h>
#include <stdlib.h>	/* exit を利用するために必要 */

/*
 *	ハノイプログラムには、s_hanoi.h が必要
 */

#include "s_hanoi.h"

/*
 *	hanoi ( char *f, char *t, char *w, char *size )
 *		高さ size のハノイの塔を、
 *			f で表されている棒から
 *			t で表されている棒へ
 *			w で表されている棒を
 *				作業領域として利用して移動する
 *					w は空っぽか、size より大きな円盤しかない
 */

void hanoi ( char *f, char *t, char *w, char *size ) {

  if ( !strcmp ( size, "" ) ) { /* 空っぽだったら*/
	/* する事はない */
  } else {	/* まだ仕事があるなら */
	/* やりたい事は、
		「size の大きさの塔を f から t に動かしたい」事
		そのためには、最終的に、size の大きさの円盤を動かす必要がある。
		そのためには、
			size の大きさの上の塔を t を利用して、一旦、f から w に移し
			size の大きさ円盤を f から t に移し
			size の大きさの上の塔を f を利用して、w から、t に動かせば良い
	*/

		/* f の所にある size の円盤の上の塔を w に移動して退かす (再帰呼出し) */
	hanoi ( f, w, t, size + 1 );

		/* f の所にある size の円盤を t に移動 */

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


		/* size の円盤の上に w に退かした塔を載せる (再帰呼出し) */

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

  }
}

/*
 * ハノイの塔 プログラム
 */

int main ( int argc, char *argv[] ) {
	/*
		コマンドライン引数を用いるので、
			int main ( int argc, char *argv[] )
		と、main 関数の引数を宣言する。
	*/

	if ( argc < 1 ) {	/* 引数が指定されていない */
	   	 printf ( "ハノイの塔の高さを指定する文字列を指定してください\n" );
			/* エラーメッセージの出力 */
		exit ( -1 );	/* エラーコード : -1 でプログラム終了 */
						/* main 関数内であれば return -1; でも可 */
	} /* else {} */		/* 「else {}」は省略可 */

  /*
   * 最初は "1" に全ての円盤が置いてある
   * これを "2" に全ての円盤を移動する
   */

	/*
	 * ハノイで、できること
	 *	 s_hanoi_init() : ハノイプログラムの開始 : 最初に一度だけ呼び出す
	 *   s_hanoi_size ( char *discs ) : ハノイの塔の高さを設定する
	 *   s_hanoi_move ( char *from, char *to ) : from にある円盤を to に移す
	 *   s_hanoi_clear () : 最初の状態に戻す
	 *   s_hanoi_stop() : ハノイ塔プログラムの終了 : return 0 の前に呼び出す
	 */

	s_hanoi_init();	/* ハノイの塔のプログラムの初期変化 */

	/* コマンドライン引数の一つ目 (argv[1]) で、問題の高さを初期化 */
	/* s_hanoi_size を呼び出す */


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


	printf ( "これから解答を開始します。[Enter] キーを押してください\n" );
	putchar ( '>' );
	putchar ( getchar() );	/* 開始前に、一旦停止 */

	/* 解答開始 */

	hanoi ( "1", "2", "3", argv[1] );

	/* 解答終了 */

	printf ( "プログラムを終了するには [Enter] キーを押してください\n" );
	putchar ( '>' );		/* 終了前に確認 */
	putchar ( getchar() );

	s_hanoi_stop();

	return 0;
}
20170602-02.c の実行結果
$ ./20170602-02-QQQQ.exe 1234
これから解答を開始します。[Enter] キーを押してください
>
プログラムを終了するには [Enter] キーを押してください
>
$