#author("2022-06-27T17:21:29+09:00","ldap:bbm85148","土村 展之") * 11章 問題4. [ファイルの書き込み] [#u9455c5f] プログラムで計算した数学関数の値をプロットしたい。C言語の標準ライブラリには、グラフィック表示の機能がないので、計算した数値を外部ファイルに保存して、Excel 上でグラフを描画することにする。 > 今回保存するファイルの拡張子は csv とする。カンマ区切り形式(comma-separated values)と呼ばれるもので、1行の中での項目の区切りにコンマを記入する。 + 177ページのリスト11.1を参考に、次のプログラムを作れ。 -- 出力ファイル名は "func.csv" とする。 -- 出力する内容の、1行目を以下とする。 x,sin(x),cos(x) -- x を -3.5 から +3.5 まで 0.1 刻みで変化させながら、x, sin(x), cos(x) の値を、以下のような形式で出力する。(printf()の書式なら "%f,%f,%f\n" である。) -3.500000,0.350783,-0.936457 -3.400000,0.255541,-0.966798 ... + プログラムを実行して、"func.csv" ができることを確かめる。 + "func.csv" をExcelで開く。(演習室PCでは、ダブルクリックするだけでよい。) + Excel上で「挿入」→「グラフ」の散布図(のいずれか)を選ぶ。 #ref(func.png,,50%); &br; + プロットされたグラフができたら、Excel上で「名前をつけて保存」を選んで、ファイルの種類を「Excelブック(*.xlsx)」に変更して、"func.xlsx" の名前で保存する。 #ref(func-xlsx.png,,50%); &br; + sin(x), cos(x) を、別の数学関数に自由に変更して、グラフをプロットしなおし、''C言語ソースと "func.xlsx" を提出せよ''。 -- プログラムを実行しなおすたびに Excel を閉じる必要がある。(そうでないと、ファイルオープンに失敗する。) -- x の範囲や刻み幅は、自由に変更してよい。 -- 数学関数は ax^2+bx+c, 1/x, sin(2*x), floor(x) など、何でもよい。種類を増やしてもよい。 -- CSVファイルの1行目が、グラフの系列名に使われるので、合わせて変更する。 -- 参考までに、sin(x) のマクローリン展開のn次近似ルーチンと、作成したExcelファイル &ref(sin.xlsx); を掲出する。 double sin_maclaurin(int n, double x) { double sum = 0; double expx = 1; // x^i double fact = 1; // i! for (int i=1; i<=n; i++) { expx *= x; fact *= i; if (i%4==1) sum += expx/fact; if (i%4==3) sum -= expx/fact; } return sum; } -- Excel以外にも、グラフ描画に都合のよいソフトはいくつもある。自動処理にはフリーソフトの gnuplot や R のほうが便利。 -- C言語プログラムに限らず、CSV形式を介して別ソフトとの連携を行う機会は多い。