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