課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 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-QQQQ.exe fexp = 2.71828198432922363281250000000000000 dexp = 2.71828182845904553488480814849026501 M_E = 2.71828182845904509079559829842764884 $
Download : 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-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 $