#author("2024-05-23T14:48:05+09:00","ldap:bbm85148","土村 展之") #author("2024-05-23T14:50:00+09:00","ldap:bbm85148","土村 展之") [[プログラミング実習II知機>../#A11]] * 11章 問題5. [ファイルの書き込み] [#g985a973] プログラムで計算した数学関数の値をプロットしたい。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上で「挿入」→「グラフ」の散布図(のいずれか)を選ぶ。 + Excel上で「挿入」→「グラフ」の散布図(のいずれか)を選ぶ。カーソル位置の数値を元に、グラフを描く。 #ref(プログラミング実習II知機2023/11_6_5/func.png,,50%); &br; + プロットされたグラフができたら、Excel上で「名前をつけて保存」を選んで、ファイルの種類を「Excelブック(*.xlsx)」に変更して、"func.xlsx" の名前で保存する。 #ref(プログラミング実習II知機2023/11_6_5/func-xlsx.png,,50%); &br; + このようにして作ったプログラムを自由に改造し、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行目が、グラフの系列名に使われるので、数値の説明になるように変更すること。 -- 参考までに、sin(x) のマクローリン展開のn次近似ルーチンと、作成したExcelファイル &ref(プログラミング実習II知機2023/11_6_5/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形式を介して別ソフトとの連携を行う機会は多い。