出力データをCSV形式で保存すれば、Excelなどのスプレッドシートでただちに読み出すことができる。CSV形式は一組のデータをコンマで区切り、組ごとに改行したフォーマットである。CSVファイルを作成するにはファイルの読み書きに関する関数を使う方法もあるが、ここでは「リダイレクト」機能を使った方法を紹介する。
リダイレクトは標準入出力の対象をファイルや別のプログラムにすることを指す。具体的には、「<」や「>」などの記号を使って以下のように記述する。
program.exe > output.csv
」標準出力をファイルに書き込む(上書き)program.exe >> output.csv
」標準出力をファイルに追記するprogram.exe < output.csv
」標準入力をファイルから読み込むVisual Studio上でコマンド引数を指定するには、メニューから「プロジェクト」>「(プロジェクト名)のプロパティ」をクリックし、左枠内の構成プロパティ>デバッグをクリックする。そして、右側の枠内の「コマンド引数」の欄にリダイレクトを指定する。
以下のプログラムを実行してみよう。正しく実行できたら、リダイレクト先を"output.csv"に設定してもう一度実行しよう。
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("n, err, approx\n"); // 項目名
int n = 0;
double pi0, pi1 = 0, err, sign = 1;
double eps = 1.0e-2;
const int MAXLOOP = 1000;
do {
pi0 = pi1;
double k = (double)n;
pi1 += sign * (4.0 / (2 * n + 1));
err = fabs(pi1 - pi0);
printf("%d, %g, %g\n", n, err, pi1);
sign *= -1;
n += 1;
if (n > MAXLOOP) {
fprintf(stderr, "既定のループ回数を超過しました\n");
break;
}
} while (err >= eps);
return 0;
}
次に、出力されたcsvファイルをExcelを使ってグラフ化する。
上記の操作を行い、グラフを描いてみましょう。グラフから何がわかるでしょうか?
ここまで、各種の数学関数と、計算結果を出力しグラフに描画する手順を紹介しました。それぞれの説明を復習しつつ、レポート課題1に取り組みましょう。
以下は、疑似乱数を発生させて、それらの平均値と標準偏差を求めるプログラムです。下記の仕様を満たすように、プログラム中の(1)~(9)の穴を埋めて完成させてください。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define LEN 4
#define SEED __(1)__
int main(void)
{
int i, j, random;
int n[] = {10, 20, 100, 1000};
double sum, ssqu, mean[LEN], sd[LEN];
srand( __(2)__ );
for (i = 0; i < LEN; i++){
sum = ssqu = 0.0;
for (j = 0; j < n[i]; j++){
random = rand()%__(3)__; /*ヒント:1~100までの表し方*/
sum += random;
ssqu += __(4)__; /*ヒント:ssquは乱数の二乗和*/
}
mean[i] = __(5) / __(6)__; /*平均値*/
sd[i] = sqrt(fabs(ssqu/n[i] - pow(mean[i], 2)));
}
printf("N, Mean, SD\n");
for (i = 0; i < LEN; i++) {
printf("%d, %4.2lf, %4.2lf\n", __(7)__, __(8)__, __(9)__);
}
return 0;
}
横軸を疑似乱数の個数(10、20、100、1000)、縦軸を平均値とするグラフ(棒グラフ)をExcelを用いて作成してください。
なぜ標準偏差が必要なのか?