Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

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

本日の課題

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

課題 20211210-01 : 自然対数の底の計算

Download : 20211210-01.c

20211210-01.c
/*
 * 20211210-01-QQQQ.c
 *	
 */

#include <stdio.h>
#include <math.h>

/*
 *
 */

#define	EPS	(1e-300)		/* 1/i! の下限 */

/*
 *	float 型での計算
 */

float fexp() {
	  int i;
	  float fe = 1.0;	/* fe = 1 + \sum_{i=1}^n 1/(i!) */
	  float fs = 1.0;	/* fs = 1/(i!), 1/(0!) = 1/1 = 1 */

	  for ( i = 1; ; i++ ) {

		/* 1/(i!) = (1/((i-1)!))/i */

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

		  fe = fe + fs;

		  if ( (double)fs < EPS ) {
		  	return fe;
		  }
	  }

}

/*
 *	double 型での計算
 */

double dexp() {
	  int i;
	  double ds = 1.0;
	  double de = 1.0;

	  for ( i = 1; ; i++ ) {
	  	  ds = ds / (double)i;

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


		  if ( (double)ds < EPS ) {
		  	return de;
		  }
	  }

}


/*
 * main
 */

int main ( void ) {

		/* fexp の結果 */
	printf ( "fexp = %40.35f\n", fexp() );
		/* dexp の結果 */

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

		/* math.h の中の定数 */
	printf ( "M_E  = %40.35f\n", M_E );

	return 0;
}
20211210-01.c の実行結果
$ ./20211210-01-QQQQ.exe
fexp =    2.71828198432922363281250000000000000
dexp =    2.71828182845904553488480814849026501
M_E  =    2.71828182845904509079559829842764884
$ 

課題 20211210-02 : 動的なメモリの利用

Download : 20211210-02.c

20211210-02.c
/*
 * DATE-02-QQQQ.c
 *
 *	動的なメモリの確保
 *		キーボードより正の整数を幾つか入力して、その要素が入った配列を返す
 *		0 以下の整数が入力されたら、終了とする
 *		配列のサイズは、正の整数の個数 + 1 とし、最後の要素には 0 を入れる
 */

/*
 * 利用方法
 *		コンパイル
 *			cc -o BASENAME.exe FILENAME
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>
#include <malloc.h>		/* calloc/free を利用するので必要 */

/*
 *	read_n_integers
 */

int	*read_n_integers( int size ) {
	int num;			/* キーボードから入力された数値を保存する */
	int *value;			/* 確保された配列の先頭要素へのポインター */

	printf ( "正の整数値を入力してください(0 以下だと入力を終了します):" );
	scanf ( "%d", &num );

	if ( num <= 0 ) {	/* 入力が全部終ったので、配列を作成する */

		/* 配列のサイズは、引数で指定された個数 + 1 となる */
		if ( ( value = (int *)calloc ( size + 1, sizeof ( int ) ) ) != NULL ) {

			/* 動的メモリは取り出せるとは限らないので、結果をチェック */
			value[ size ] = 0;	/* 最後の要素として 0 を代入 */

		} /* else {} */ /* NULL が帰った場合は、そのまま、値として返す */
	} else {	/* 入力が終っていないので、更に、値を読むために再帰呼び出し */

		if ( ( value = read_n_integers( size + 1 ) ) != NULL ) {
			/* 結果が NULL でなければ、配列が作られている */

			/* size 番目の要素を配列に記録 */

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

		} /* else {} */ /* NULL が帰った場合は、そのまま、値として返す */
	}

	/* いずれの場合でも value を返す */

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

}

/*
 * main
 */

int main ( int argc, char *argv[] ) {
	int *array;		/* n 個数の要素をもつ配列の先頭をもつ */
	int i;

	/* read_n_integers を呼び出して、n 個の整数値を入力する */
	/* 引数には、入力済のデータ数を指定するので、最初は 0 を指定する */

	if ( ( array = read_n_integers( 0 ) ) != NULL ) {
		/* read_n_integers は、NULL を返す可能性がある */

		/* 入力された要素を画面に出力 */
		for ( i = 0; array[i] > 0; i++ ) {
			printf ( "%d th data = %d\n", i, array[i] );
		}

		/* malloc/calloc で確保したメモリは、必ず free で解放する */


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


	} /* else {} */	/* NULL の場合はエラーなので、何もしない */

	return 0;
}
入力例
12
34
5
6
90
-1
20211210-02.c の実行結果
$ ./20211210-02-QQQQ.exe
正の整数値を入力してください(0 以下だと入力を終了します):12
正の整数値を入力してください(0 以下だと入力を終了します):34
正の整数値を入力してください(0 以下だと入力を終了します):5
正の整数値を入力してください(0 以下だと入力を終了します):6
正の整数値を入力してください(0 以下だと入力を終了します):90
正の整数値を入力してください(0 以下だと入力を終了します):-1
0 th data = 12
1 th data = 34
2 th data = 5
3 th data = 6
4 th data = 90
$