#author("2023-06-28T15:52:32+09:00","ldap:bbm85148","土村 展之")
#author("2023-06-28T16:18:03+09:00","ldap:bbm85148","土村 展之")
[[プログラミング実習II知機>../#A11]]
* 11章 問題5. [ファイルの書き込み] [#yb5d10ef]

プログラムで計算した数学関数の値をプロットしたい。C言語の標準ライブラリには、グラフィック表示の機能がないので、計算した数値を外部ファイルに保存して、Excel 上でグラフを描画することにする。
> 今回保存するファイルの拡張子は csv とする。カンマ区切り形式(comma-separated values)と呼ばれるもので、1行の中での項目の区切りにコンマを記入する。

+ 187ページのソースコード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" を生成する。テキストエディタで開いて、内容を確認するとよい。
> +3.5 の行が出力されないことがあるが、浮動小数点演算の誤差のためであるので、気にしなくてよい。→212ページのソースコードA.1「0.1を10回足した結果を表示する」
<
+ "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" を提出せよ''。
+ このようにして作ったプログラムを自由に改造し、sin(x), cos(x) を別の数学関数に変更せよ。プログラムを実行して "func.csv" を再生成し、グラフをプロットしなおして
"func.xlsx" も保存しなおせ。提出するものは、''改造したC言語ソースと、対応する "func.xlsx"''である。
-- プログラムを実行しなおすたびに Excel を閉じる必要がある。(そうでないと、ファイルオープンに失敗する。)
-- 数学関数は ax^2+bx+c, 1/x, sin(2*x), floor(x) など、何でもよい。種類を増やしてもよい。
-- x の範囲や刻み幅は、自由に変更してよい。
-- CSVファイルの1行目が、グラフの系列名に使われるので、合わせて変更する。
-- プロットする 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形式を介して別ソフトとの連携を行う機会は多い。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS