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