プログラムの実行結果をファイルに保存したい場合,
短いものなら Cygwin の画面からコピーすればよいが,
長いものは直接ファイルに書き出す方法を用いる.
例題 10.1
1 から 500 までの整数 x について,
f(x) = 3 log e と g(x) = √x を計算し,
下のようなフォーマットで出力するプログラムを作成せよ.
f(x) と g(x) の値は小数点以下 8 桁まで出力せよ.
次に, このプログラムの実行結果をテキストファイル tmp.txt に保存せよ.
1 0.00000000 1.00000000 2 2.07944154 1.41421356 3 3.29583687 1.73205081 4 4.15888308 2.00000000 … 498 18.63180023 22.31591360 499 18.63781829 22.33830790 500 18.64382430 22.36067977 |
ex101.c |
---|
#include <stdio.h> #include <math.h> int main( void ) { int x; for (x=1; x<=500; x++) { printf("%d %0.8f %0.8f¥n", x, 3*log(x), sqrt(x)); } return 0; } |
./a > tmp.txt |
メモ帳で開くと正しく改行されていないので, 必ず TeraPad で開くこと.
課題 10.1 1 から 100 までの整数 x について,
out.txt を開いて, 内容が下記のようになっていることを確認せよ.
out.txt |
---|
1 0.09983342 7.29500000 2 0.28096086 7.58000000 ... 98 -3.62795828 -11.62000000 99 -4.55242466 -12.30500000 100 -5.44021111 -13.00000000 |
Cプログラムで計算した結果をエクセルに取り込み, 表やグラフ等を作成することができる.
例題 10.2 例題 10.1 の計算結果を下記のようにエクセルに取り込み, グラフを作成せよ.
1 | 0.00000000 | 1.00000000 |
2 | 2.07944154 | 1.41421356 |
3 | 3.29583687 | 1.73205081 |
4 | 4.15888308 | 2.00000000 |
… | … | … |
498 | 18.63180023 | 22.31591360 |
499 | 18.63781829 | 22.33830790 |
500 | 18.64382430 | 22.36067977 |
ex101.c のプログラムで, 数値に区切りをスペースからタブ (¥t)に変更する.
ex102.c |
---|
#include <stdio.h> #include <math.h> int main( void ) { int x; for (x=1; x<=500; x++) { printf("%d¥t%0.8f¥t%0.8f¥n", x, 3*log(x), sqrt(x)); } return 0; } |
./a > tmp.txt |
課題 10.2
課題 10.1 で作成したプログラムの実行結果をエクセルに取り込み, グラフを作成せよ.
完成したエクセルファイルを out.xlsx という名前で保存せよ.
プログラムに与えるデータが長くなると, いちいち手で打ち込むのは面倒である.
データをテキストファイルに作成して, そこからプログラムに読み込むことができる.
例題 10.3
まず, 次のようなデータをテキストファイル ex103.txt に保存せよ.
次に, 各行の 1 つめのデータを x,
2 つめのデータを y としてファイルからデータを読み込み,
x, y, d=sqrt(x2+y2) をタブ区切りで出力するプログラムを作成せよ.
ex103.txt |
---|
1.0 1.0 3.2 4.3 5.5 6.7 7.9 8.1 |
テキストファイルは必ず TeraPad で作成し, UTF-8N で保存すること.
メモ帳で作成したり, UTF8 で保存すると, プログラムが無限ループに陥るので注意!
プログラムは次の通り.
ex103.c |
---|
#include <stdio.h> #include <math.h> int main( void ) { double x, y, d; for (;;) { /* 無限ループ (break 文で終了する) */ /* x と y を読み込む. */ /* EOF は 'end of file' の略 */ /* データが無くなったら break 文でループを終了する */ if (scanf("%lf %lf", &x, &y)==EOF) break; d = sqrt(x*x+y*y); printf("%g¥t%g¥t%g¥n", x, y, d); } return 0; } |
./a < ex103.txt 1 1 1.41421 3.2 4.3 5.36004 5.5 6.7 8.66833 7.9 8.1 11.3146 |
./a < ex103.txt > tmp.txt |
課題 10.3
テキストファイル in103.txt に次のようなデータを保存せよ (コピー&ペーストせよ).
各行の 1 つめのデータを a, 2 つめのデータを b, 3 めのデータを c とする.
ファイルからデータを読み込み, a, b, c の相乗平均 g を求め,
a, b, c, g をタブ区切りで出力するプログラム geomean.c を作成せよ.
(A の 3 乗根は, pow(A, 1/(double)3) で求めることができる.)
in103.txt |
---|
1.0 1.0 1.0 1.0 2.0 3.0 1.5 2.5 3.5 1.1 2.2 3.3 4.2 3.4 7.9 9.2 4.1 2.2 1.3 9.2 8.1 3.4 5.2 1.9 3.3 5.7 9.9 1.3 2.4 8.4 |
1 1 1 1 1 2 3 1.81712 1.5 2.5 3.5 2.35885 1.1 2.2 3.3 1.99883 4.2 3.4 7.9 4.83191 9.2 4.1 2.2 4.36179 1.3 9.2 8.1 4.59274 3.4 5.2 1.9 3.2266 3.3 5.7 9.9 5.71051 1.3 2.4 8.4 2.97038 |
エクセルで計算できるものはエクセルで計算すればよいが, C でなければ計算できない場合には,
ファイルを介してエクセルから C にデータに受け渡して計算する.
例題 10.4
下記のようなデータが入っているエクセルファイル ex104.xlsx をダウンロードせよ.
各行の x, y について, 例題 10.3 のプログラム ex103.c で d = sqrt(x2+y2) の値を計算し,
結果を d の列に書き込め.
ex104.xlsx | ||
---|---|---|
x | y | d |
1.0 | 1.0 | |
3.2 | 4.3 | |
5.5 | 6.7 | |
7.9 | 8.1 |
ex104.txt |
---|
1.0 1.0 3.2 4.3 5.5 6.7 7.9 8.1 |
./a < ex104.txt 1 1 1.41421 3.2 4.3 5.36004 5.5 6.7 8.66833 7.9 8.1 11.3146 |
./a < ex104.txt > tmp.txt |
ex104.xlsx | ||
---|---|---|
x | y | d |
1.0 | 1.0 | 1.41421 |
3.2 | 4.3 | 5.36004 |
5.5 | 6.7 | 8.66833 |
7.9 | 8.1 | 11.3146 |
課題 10.4
下記のようなデータが入っているエクセルファイル data104.xlsx をダウンロードせよ.
各行の a, b, c について, 課題 10.3 で作成した geomean.c で a, b, c の相乗平均 g を計算し,
結果を g の列に書き込め.
data104.xlsx | |||
---|---|---|---|
a | b | c | g |
0.00 | 13.15 | 75.56 | |
45.87 | 53.28 | 21.90 | |
4.70 | 67.89 | 67.93 | |
… | … | … | |
16.73 | 56.51 | 98.54 |
data104.xlsx | |||
---|---|---|---|
a | b | c | g |
0.00 | 13.15 | 75.56 | 0.00000 |
45.87 | 53.28 | 21.90 | 37.68590 |
4.70 | 67.89 | 67.93 | 27.88190 |
… | … | … | |
16.73 | 56.51 | 98.54 | 45.33270 |
科目名: コンピュータ演習A 課題: C10 番号: 9999 氏名: 関学 太郎 作成: 20oo年oo月oo日 ------------------------------------------------------------- [課題 10.1] 実行結果は下記の通りである. (Cygwinの実行結果を貼り付ける) 〜で苦労した, 〜を工夫した, 等 ------------------------------------------------------------- ([課題 10.2] 以降も同様) ------------------------------------------------------------- [感想] (今回の課題に関する感想を書く) ------------------------------------------------------------- [この科目全体に関する感想] (この科目全体に関する感想を書く) |