第14章 ファイル操作 (コマンドプロンプト版) CSVファイルへの出力 CSVファイルからの入力 CSVファイルへの追加出力 練習問題 Excel による関数グラフ描画 今日のポイント リダイレクトとCSVファイルをうまく使おう 1 CSVファイルとは コンマ区切り(Comma Separated Values)形式 のテキストファイル データをコンマ(,)で区切り、改行を用いて2次元 的に配列 コンマを含むデータは二重引用符(")でくくられる 標準出力例 printf("%f, %f, %f\n", a, b, sum); 標準入力例 scanf("%lf, %lf, %lf", &a, &b, &sum); 2 例14.1.1 CSVファイルへの出力 /* ex14_1_1.c */ notepad で新規作成 #include <stdio.h> devenv で編集 int main(void) { double a, b, sum; a = 2.345; コンマがなければ b = 5.678; CSVじゃない sum = a + b; printf("%f, %f, %f\n", a, b, sum); return 0; } Z:\nyumon2>cl ex14_1_1.c Z:\nyumon2>ex14_1_1 > foo.csv 3 ソースファイルの新規作成と編集 notepad (メモ帳) 新規作成のとき Z:\nyumon2>notepad ex14_1_1.c 保存先が Z:\nyumon2 であることを確認 copy (内部コマンド) コピーするとき Z:\nyumon2>copy ex14_1_1.c ex14_2_1.c 以前作った14章のファイルを exploler でコピーしてもよい devenv (開発環境) 編集するとき Z:\nyumon2>e14_1_1.c 4 例14.2.1 CSVファイルからの入力 /* ex14_2_1.c */ copy でコピー #include <stdio.h> devenv で編集 int main(void) { コンマを取ったら? double a, b, sum; scanf("%lf, %lf, %lf", &a, &b, &sum); printf("a=%f, b=%f, sum=%f\n", a, b, sum); return 0; } Z:\nyumon2>copy ex14_1_1.c ex14_2_1.c Z:\nyumon2>ex14_2_1.c Z:\nyumon2>cl ex14_2_1.c Z:\nyumon2>ex14_2_1 < foo.csv 5 例14.2.2 CSVファイルからの入力 /* ex14_2_2.c */ #include <stdio.h> int main(void) { double a, b, sum; char s[135]; fgets(s, 128, stdin); sscanf(s, "%lf, %lf, %lf", &a, printf("a=%f, b=%f, sum=%f\n", return 0; } copy でコピー devenv で編集 コンマを 取ったら? &b, &sum); a, b, sum); fgets: 一行入力、sscanf: 文字列sからscanf Z:\nyumon2>cl ex14_2_2.c Z:\nyumon2>ex14_2_2 < foo.csv 6 例14.3.1 CSVファイルへの追加出力 /* ex14_3_1.c */ copy でコピー #include <stdio.h> devenv で編集 int main(void) { double a, b, sum; a = 1.234; b = 2.567; sum = a + b; printf("%f, %f, %f\n", a, b, sum); return 0; } Z:\nyumon2>cl ex14_3_1.c Z:\nyumon2>ex14_3_1 >> foo.csv 7 例14.4.3, 例14.5.1のための準備 boo.csvファイルの作成 Z:\nyumon2>notepad boo.csv 1.000000, 2.000000 3.000000, 4.000000 5.000000, 6.000000 以前の第14章14.4の学習時に例14.4.3で用いた foo.txt が 作ってある人は、そこからコピーすればよい 8 例14.4.3 標準ファイル入出力 /* ex14_4_3.c stdin version */ #include <stdio.h> int main(void) 読んですぐ使い捨てるので配列は不要 { double x, y; fgets関数の値が NULL でない(入力 int i = 0; が Ctrl-z でない)間は{}を繰り返す char s[135]; while (fgets(s, 128, stdin) != NULL) { sscanf(s, "%lf, %lf", &x, &y); printf("%f, %f\n", x, y); i++; } printf("ファイル中のデータ (x, y) の数は %d 組です.\n", i); return 0; } Z:\nyumon2>cl ex14_4_3.c Z:\nyumon2>ex14_4_3 < boo.csv 9 例14.5.1 標準ファイル入出力 /* ex14_5_1.c stdin version */ #include <stdio.h> int main(void) { double a, b, sum; char s[135]; while (fgets(s, 128, stdin) != NULL) { sscanf(s, "%lf, %lf", &a, &b); sum = a + b; printf("%f, %f, %f\n", a, b, sum); } return 0; } Z:\nyumon2>cl ex14_5_1.c Z:\nyumon2>ex14_5_1 < foo.csv > bar.csv 10 教科書p.139 問題14.1 関数値を出力するプログラム /* q14_1_1.c */ #include <stdio.h> int main(void) { int i; double x, y; for (i = -10; i <= 10; i++) { x = i; y = 2*x*x + 3; printf("%f, %f\n", x, y); } return 0; } Z:\nyumon2>cl q14_1_1.c Z:\nyumon2>q14_1_1 > data1.csv 11 データの項目名も出力する場合 /* q14_1_2.c */ #include <stdio.h> int main(void) { int i; double x, y; この行を追加 printf("x, y\n"); for (i = -10; i <= 10; i++) { x = i; y = 2*x*x + 3; printf("%f, %f\n", x, y); } return 0; } 12 Excel による関数グラフ描画 1. 2. 3. 4. 5. CSVファイルをダブルクリックして、Excelを起動 Microsoft Excelブック(*.xls)形式で保存 忘れない うちに保存 プロットしたいデータのセル範囲を選択 「グラフウィザード」をクリック 「散布図」を選択し、「形式(T)」で好みの折れ線グラフを 選択 6. 「次へ>」を2回クリックし、「タイトルとラベル」タブを表示 7. 「X/数値軸(A)」に x、「Y/数値軸(V)」に y を記入 8. 「完了」をクリック 最後に上書き保存 13 Excel におけるグラフの修正 必ずグラフエリアを選択した状態で行う 「グラフ(C)」メニューの「グラフオプション(C)...」に よる変更 「グラフ(C)」メニューの「元のデータ(S)...」による 変更 「目盛線」タブでY軸の目盛線の削除、など 「系列」タブで各系列に名前を設定、など 右クリックでの「~書式設定(O)…」による変更 「軸の書式設定(O)...」の「目盛」タブで範囲の変更、など 14 修正前と修正後 250 200 y 150 y 系列 1 250 100 y = 2 x^2 + 3 50 200 0 -20 -10 0 10 150 20 x 100 50 0 -10 -5 x 0 5 10 15 Excel で対数グラフを描く 1. 0より大きいデータ領域のみを選択 2. 「グラフウィザード」により「散布図」の折れ線 グラフを描く 3. X軸またはY軸の数値軸(目盛)を右クリック 4. 「軸の書式設定(O)...」をクリック 5. 「目盛」タブを選択 6. 下方の「対数目盛を表示する(L)」をチェック 7. 「 OK 」をクリック 8. 「グラフオプション(O)…」で目盛線を描く 16 第2回レポートの類題 スキルアップタイム 1 1. 標準入力から x と y を読み込み、プログラム中 で z = x3 - 75x を計算し、x, y, z を標準出力す るプログラム q14_s.c を作成せよ 2. data1.csv から入力し、結果を data2.csv に書き 込め 3. 例14.5.1のプログラムを参考にするとよい 17 スキルアップタイム 2 1. 2. 3. 4. 5. 6. 7. 8. data2.csv をExcelで読み込み、data2.xls に保存 Xラベルを x、Yラベルを y, z としてグラフを描画 X軸の範囲を -10 ~ 10、 Y軸の範囲を -300 ~ 300 に 変更 Y軸の目盛線を削除 凡例の系列1に y = 2x^2 + 3、系列2に z = x^3 - 75x と記入 凡例をプロットエリア内の空いている領域に移動 プロットエリアのサイズを調整 プロットエリアの背景色をなくす 18 第3回レポート(必須) 課題: スキルアップタイム 1 および 2 提出期限: 2010年1月8日(金) 12:50 提出場所: ネットワーク実験室(1)入口の提出箱 以下の項目を入れること(表紙は不要) 1. 学籍番号、氏 名 2. 3. "q14_s.c" のソースリスト 実行結果(data2.csv)とそのグラフ 4. 感想 第2回レポートの類題 19 前回のスキルアップタイムの解答例 ~コマンド行引数を用いた自作コマンドの作成~ コマンド行で指定した文字の数をカウントする chc.c を完成させよう /* chc.c: char counter */ #include <stdio.h> int main(int argc, char *argv[]) { int c, cnt=0; while ((c=fgetc(stdin)) != EOF) { if (c == *argv[1]) cnt++; } printf("%c: %d\n", *argv[1], cnt); return 0; } 20 前回のスキルアップタイム (オプション)の解答例 /* excel exec program */ excel3.c #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char cmd[128]="\"C:\\Program Files\\" "Microsoft Office\\Office11\\Excel.exe\" "; if (argc > 1) strcat(cmd, argv[1]); system(cmd); return 0; } Z:\nyumon2>cl excel3.c Z:\nyumon2>excel3 foo.csv 21
© Copyright 2024 ExpyDoc