第14章 ファイル操作(コマンドプロンプト版)

Excelとの連携 2




実数列を生成する際の注意
数学関数の利用
Excel によるリサージュ図形描画
Excel による対数グラフ描画
今日のポイント
関数グラフ描画のためのテクニックを身につける
1
CSVファイルとは(再掲)

コンマ区切り(Comma Separated Values)形式の
テキストファイル

データをコンマ(,)で区切り、改行を用いて2次元
的に配列

コンマを含むデータは二重引用符(")でくくられる。
ファイル出力例
fprintf(fp,"%f, %f, %f\n", a, b, sum);
ファイル入力例
fscanf(fp,"%lf, %lf, %lf", &a, &b, &sum);
2
例14.1.1 CSVファイルへの出力
(コマンドプロンプトを使わない場合)
/* ex14_1_1.c */
#include <stdio.h>
int main(void)
教科書p.129参照
{
double a, b, sum;
FILE *fp;
a = 2.345;
b = 5.678;
sum = a + b;
fp=fopen("foo.csv","w");
fprintf(fp,"%f, %f, %f\n", a, b, sum);
fclose(fp);
コンマがなければ
return 0;
CSVじゃない
}
3
実数列を生成するプログラム(悪い例)
/* forflt1.c */
#include <stdio.h>
int main(void)
{
float x; // double にするとどうなる?
for (x = 0; x <= 1; x += 0.01) {
printf(" x = %g\n", x);
}
return 0;
}
%g は %f と %e の
いいとこどり
4
実行結果(悪い例)
Z:\nyumon2>cl forflt1.c
...
Z:\nyumon2>forflt1
x=0
x = 0.01
0.84 あたりから誤
...
差が蓄積
x = 0.999999
5
実数列を生成するプログラム(よい例)
/* forflt2.c */
#include <stdio.h>
int main(void)
{
int i;
float x;
for (i = 0; i <= 100; i++) {
x = i/100.0; // 100 にするとどうなる?
// 100. では?
printf(" x = %g\n", x);
}
return 0;
}
6
実行結果(よい例)
Z:\nyumon2>cl forflt2.c
...
Z:\nyumon2>forflt2
x=0
x = 0.01
...
x=1
7
数学関数の利用例
/* pi.c */
#include <stdio.h>
#include <math.h>
教科書pp.16~18参照
int main(void)
{
printf("PI = %.20g\n", 4.0*atan(1.0));
return 0;
}
小数以下20桁
atan(x): arctan(x), すなわち tan-1(x) を計算(ラジアン)
8
リサージュ図形を生成するプログラム1
/* Lissaje1.c */
#include <stdio.h>
#include <math.h>
数字の組み合わせを
int main(void)
変えてみると…
{
int i;
double th, x, y, PI=3.14159265358979;
for (i = 0; i <= 200; i++) {
th = PI*(i/100.0);
x = cos(5*th); y = sin(7*th);
printf("% .5f, % .5f\n", x, y);
}
return 0;
空白を入れておくと
}
負の数のときも揃う
9
コマンドプロンプトで実行
Z:\nyumon2>cl lissaje1.c
...
...
Z:\nyumon2>lissaje1 > lissaje1.csv
10
Excel によるリサージュ図形描画
1.
2.
3.
4.
5.
CSVファイルをダブルクリックして、Excelを起動
Microsoft Excelブック(*.xls)形式で保存
忘れない
うちに保存
プロットしたいデータ列を2列分選択
「グラフウィザード」をクリック
「散布図」を選択し、「形式(T)」でマーカーなしの折れ線
グラフを選択
6. 「次へ>」を2回クリックし、「タイトルとラベル」タブを表示
7. 「X/数値軸(A)」に x、「Y/数値軸(V)」に y を記入
8. 「完了」をクリック
最後に上書き保存
11
Excel におけるリサージュの修正


必ずグラフエリアを選択した状態で行う
「グラフ(C)」メニューの「グラフオプション(C)...」に
よる変更



「目盛線」タブでY軸の目盛線の削除
「凡例」タブで凡例の削除
右クリックでの「~書式設定(O)…」による変更


「軸の書式設定(O)...」の「目盛」タブでX(Y)/数値軸との
交点(C)変更
「プロットエリアの書式設定(O)...」で領域の背景色削除
12
修正前と修正後
1.5
1
0.5
1.5
y
0
-1
-0.5
0
0.5
1
1.5
0.5
-0.5
y
-1.5
1
系列1
-1
0
-0.5
-1.5
x
-1
-1.5
-1.5
-1
-0.5
0
0.5
1
1.5
x
13
リサージュ図形を生成するプログラム2
/* Lissaje2.c */
#include <stdio.h>
#include <math.h>
int main(void)
{
int i;
double th, x, y, PI=3.14159265358979;
for (i = 0; i <= 200; i++) {
th = PI*(i/100.0);
x = (cos(5*th)+sin(7*th))/2;
y = (sin(5*th)+cos(7*th))/2;
printf("% .5f, % .5f\n", x, y);
}
return 0;
}
14
対数グラフに表示させる例
/* sinc2.c */
#include <stdio.h>
RAND_MAXに必要
#include <stdlib.h>
#include <math.h>
int main(void)
ノイズを加えている
{
(省略してもよい)
int i;
double x, y, PI=3.14159265358979;
for (i = 1; i <= 300; i++) {
x = i/10.; y = sin(PI*x)/(PI*x);
y += (0.01*rand())/RAND_MAX;
printf("%.5g, %.5g\n", x, y*y);
}
return 0;
}
15
コマンドプロンプトで実行
Z:\nyumon2>cl sinc2.c
...
...
Z:\nyumon2>sinc2 > sinc2.csv
16
Excel で対数グラフを描く
1. CSVファイルを開き、*.xls 形式で保存
2. 「グラフウィザード」により「散布図」の折れ線
グラフを描く
3. X軸またはY軸の数値軸(目盛)を右クリック
4. 「軸の書式設定(O)...」をクリック
5. 「目盛」タブを選択
6. 下方の「対数目盛を表示する(L)」をチェック
7. 「 OK 」をクリック
17
Excel における対数グラフの修正
8. 「グラフオプション(O)…」で目盛線、補助目盛
線を描く
9. 補助目盛線を右クリックして「目盛線の書式設
定(O)...」を開き、「パターン」タブで線スタイルを
点線にする
10. X軸またはY軸の数値軸(目盛)を右クリックし
て「軸の書式設定(O)...」を開き、「目盛」タブ内
でX(Y)/数値軸との交点(C)を調節する
11. 「目盛」タブの最大値、最小値を調節する
18
修正前と修正後
1.2
1
0.1
0.1
1
1
10
100
0.01
sinc(x)^2
0.001
0.6
0.4
0.0001
0.00001
0.000001
0.2
0.0000001
1
0.00000001
0
0
5
10
15
20
25
30
35
0.000000001
x
x
0.1
sinc(x)^2
sinc(x)^2
0.8
0.01
0.001
0.0001
0.1
1
10
x
100
19
スキルアップタイム
1.
x を対数軸上で等間隔になるように生成し、
y = 1/(1+x2) を計算して x, y を標準出力する
プログラム lorentz.c を作成せよ。
2. lorentz.c をコンパイルし、その実行結果を
lorentz.csv に保存せよ。
3. 上記の結果を両対数グラフにせよ。
20
ヒント


x を等比数列にする (x = a ri , i = 0,1,2... )
x の初項は xmin(= 0.1)、公比 r は
(xmax/xmin)1/N
(Nは総データ点数)
または
101/N
(Nは1桁あたりのデータ点数)

r = pow(xmax/xmin, 1.0/N)
or r = pow(10, 1.0/N)

x = xmin*pow(r,i)
pow(x,y): べき乗関数 xy
21