Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

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

本日の課題

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

課題 20210514-01 : 一進数の割り算を計算する関数

Download : 20210514-01.c

20210514-01.c
/*
 * 20210514-01-QQQQ.c
 *	一進数の割り算
 */

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

/*
 * prototype
 */

extern void one_div ( char *a, char *b );

/*
 * one_sub_div ( a, b, c )
 * a >= b なら 1+(a-b)/c を出力、そうでなければ、何もしない (0)
 */

void one_sub_div ( char *a, char *b, char *c ) {

	if ( !strcmp ( b, "" ) ) {					/* b = 0 */
		/* b = 0 の時 : 1+(a-b)/c = 1+a/c */
		/* +1 */
		putchar ( '0' );
		/* a/c */

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

	} else if ( !strcmp ( a, "" ) ) {			/* a = 0 */
		/* a = 0, b > 0 の時 : (a-b)/c = 0 */
		/* do nothing */
	} else {
		/* a, b > 0 の時 : 1+(a-b)/c = 1+((a-1)-(b-1))/c */

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

	 }
}


/*
 * 一進数の割り算
 */

void one_div ( char *a, char *b ) {

	if ( !strcmp ( b, "" ) ) {
		printf ( "0 で割る事はできません\n" );
	} else if ( !strcmp ( a, "" ) ) {
	 	/* do nothing */			/* a/b = 0 */
	} else {
		/*            0			( a < b )
			a/b = {
					1+(a-b)/b	( a >= b )
		*/
		one_sub_div ( a, b, b );
	}
}

/*
 * main
 */

int main ( void ) {

	/* 5/2 = ? */
	one_div ( "00000", "00" );
	printf ( "\n" );

	/* 12/3 = ? */

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

	printf ( "\n" );

  return 0;
}
20210514-01.c の実行結果
$ ./20210514-01-QQQQ.exe
00
0000
$ 

課題 20210514-02 : 一進数の階乗を計算する関数

Download : 20210514-02.c

20210514-02.c
/*
 * 20210514-02-QQQQ.c
 *	一進数の階乗
 */

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

/*
 * prototype
 */

extern void fac ( char *n );

/*
 * n_time_fac ( n, n1 )
 *	fac ( n1 ) を n 回行う
 *		=> n * fac(n1)
 */

void n_time_fac ( char *n, char *n1 ) {

	 if ( !strcmp ( n, "" ) ) {					/* n = 0 */
		/* 何もしない */
	 } else {									/* n > 0 */

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

		n_time_fac ( n + 1, n1 );				/* n * fac ( n-1 ) */
	 }
}


/*
 * 一進数の階乗
 */

void fac ( char *n ) {

	 if ( !strcmp ( n, "" ) ) {					/* n = 0 */
	 	printf ( "0" );							/*		fac(0) = 1 */
	 } else {									/* n > 0 */
		n_time_fac ( n, n + 1 );				/*		fac(n) = n * fac(n-1) */
	 }

}

/*
 * main
 */

int main ( void ) {

	/* fac(3) */
	fac ( "000" );
	printf ( "\n" );

	/* fac(5) */

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

	printf ( "\n" );

  return 0;
}
20210514-02.c の実行結果
$ ./20210514-02-QQQQ.exe
000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
$