FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

Similar documents
格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

Microsoft PowerPoint - 第3回目.ppt [互換モード]

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

2006年10月5日(木)実施

Prog1_12th

演算増幅器

Microsoft PowerPoint - prog04.ppt

Taro-ファイル処理(公開版).jtd

情報処理演習 B8クラス

PowerPoint Presentation

Microsoft PowerPoint - prog06.ppt

PowerPoint Presentation

gengo1-12

02: 変数と標準入出力

C言語講座 ~ファイル入出力編~

ファイル入出力

gengo1-12

ファイル入出力

Microsoft PowerPoint - kougi6.ppt

プログラミング基礎

02: 変数と標準入出力

gengo1-12

※ ポイント ※

memo

情報処理概論(第二日目)

Microsoft Word - DF-Salford解説09.doc

計算機プログラミング

Microsoft PowerPoint - kougi2.ppt

Cプログラミング1(再) 第2回

講習No.9

Microsoft PowerPoint - 14th.ppt [互換モード]

Microsoft PowerPoint - CproNt11.ppt [互換モード]

Microsoft Word - Cプログラミング演習(9)

プログラミング実習I

訋箊æ©�ã…Šã…�ㇰㅩã…�ㅳㇰ - 第13åłž ã…Łã‡¡ã‡¤ã…«å⁄¦ç’ƒ

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft Word - Cプログラミング演習(10)

memo

PowerPoint Presentation

Microsoft PowerPoint - prog05.ppt

プログラミング演習3 - Cプログラミング -

02: 変数と標準入出力

プログラミング演習3 - Cプログラミング -

CプログラミングI

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

PowerPoint プレゼンテーション

memo

cp-7. 配列

スライド 1

格子点データの解析 4 気象庁合成レーダーの解析 気象庁合成レーダーは全国 20 か所に設置された気象レーダーによって観測されたエコー強度 ( レーダーで観測される換算降水強度 ) とエコー頂高度 ( レーダーで観測される降水エコーの高さ ) のデータです エコー強度は格子間隔が 1 km エコー頂

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

memo

演習課題No12

ゲームエンジンの構成要素

Microsoft Word - no202.docx

C言語入門

プログラミング基礎

Microsoft Word - no204.docx

演習2

プログラミング実習I

ポインタ変数

kiso2-09.key

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

02: 変数と標準入出力

プログラミング基礎

講習No.1

PowerPoint プレゼンテーション

memo

PowerPoint Presentation

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Prog1_15th

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

プログラミング基礎

ポインタ変数

Microsoft PowerPoint - prog08.ppt

Microsoft PowerPoint - 講義10改.pptx

Microsoft PowerPoint - kougi4.ppt

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

kiso2-03.key

Microsoft PowerPoint - program.ppt [互換モード]

02: 変数と標準入出力

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

講習No.12

数値計算

Microsoft PowerPoint pptx

Microsoft Word - no11.docx

PowerPoint プレゼンテーション

プログラミング基礎

スライド 1

Microsoft PowerPoint - kougi8.ppt

PowerPoint プレゼンテーション

今後の予定 6/29 パターン形成第 11 回 7/6 データ解析第 12 回 7/13 群れ行動 ( 久保先生 ) 第 13 回 7/17 ( 金 ) 休講 7/20 まとめ第 14 回 7/27 休講?

Microsoft PowerPoint - guidance.ppt

Transcription:

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作ります FORTRAN の場合 OPEN 文でファイルを開いた後 標準入力の場合と同様に READ 文でデータを読みこみます 以下のプログラムでは あらかじめ配列 Aを宣言しておき ファイルから読みこんだデータを配列 Aに代入しています プログラム : FORTRAN C PARAMETER 文で定数 IMAXを宣言する C 定数 IMAXはデータの個数を表す PARAMETER (IMAX=20) C 配列 A を宣言する REAL A(IMAX) C データを読みこむ C ファイルを開く C 機番は10 以降の番号を指定する C STATUSは読みこみの場合は 'OLD' を指定する C FORMはテキストファイルの場合は 'FORMATTED' を指定する OPEN(10,FILE='data05.txt',STATUS='OLD', + FORM='FORMATTED') C ここからデータを読みこむための DO ループが始まる C データの個数だけ反復する DO 11 I=1,IMAX C READ 文でデータを読みこむ C 機番 10を指定する * は書式を指定しないことを示す C データファイルの各行の第 1 要素が年 C 第 2 要素が配列 Aに読みこむデータである READ(10,*) IY,A(I) C ここで DO ループ 11 が終了する 11 CONTINUE 42

C ファイルを閉じる CLOSE(10) C ここからデータを書き出すための DO ループが始まる C データの個数だけ反復する DO 21 I=1,IMAX C A(I) の値を標準出力に書き出す C 機番 6を指定する C 書式は '(1X,I4,1X,F5.1)' を指定する C '1X' は1 文字の空白 'I4' は4ケタの整数 C 'F5.1' は全体が5ケタで小数点以下が1ケタの実数という意味である WRITE(6,'(1X,I4,1X,F5.1)') 1990+I,A(I) C ここで DO ループ 21 が終了する 21 CONTINUE STOP END ( 参考 )C #include <stdio.h> int main(void) /* 変数 imax を宣言する 定数 imax はデータの個数を表す */ int imax=20, i, iy; /* 配列 a を宣言する */ float a[imax]; float aa; /* ファイルポインタ fp を宣言する */ FILE *fp; /* データを読みこむ */ 43

/* ファイルを開く モードは "r"( テキストファイルの読みこみ ) を指定する */ fp = fopen( "data05.txt", "r" ); /* ここからデータを読みこむための for ループが始まる データの個数だけ反復する */ for (i=0; i<=imax-1; i++) /* 関数 fscanf でデータを読みこむ ファイルポインタ fp を指定する 書式は "%d %f"( 整数 浮動小数点 ) を指定する データファイルの各行の第 1 要素が年 第 2 要素が配列 a に読みこむデータである 関数から変数の値を返すときは 変数の値そのもの ( たとえば iy) ではなく その変数へのポインタ ( たとえば &iy) が返ってくることに注意 */ fscanf( fp, "%d %f", &iy, &aa ); a[i] = aa; /* ファイルを閉じる */ fclose( fp ); /* ここからデータを書き出すための for ループが始まる データの個数だけ反復する */ for (i=1; i<=imax; i++) /* a[i] の値を標準出力に書き出す 書式は " %4d %5.1f" を指定する "%4d" は 4 ケタの整数 "%5.1f" は全体が 5 ケタで小数点以下が 1 ケタの浮動小数点という意味である */ printf( " %4d %5.1f\n", 1990+i, a[i-1] ); 44

return 0; 実行例 : /home/snaoki> f77 prog05_1.f /home/snaoki>./a.out 1991 6.3 1992 6.8 1993 6.2 < 中略 > 2010 7.0 次に 読みこんだ値の平均値を計算し それぞれの値から平均値を差し引いた値を計算するプログラムを作成します あらかじめ配列 AとBを宣言しておき 配列 Aにデータファイルから読みこんだ値を代入します 次に 平均値を計算し 配列 Aの各要素の値から平均値を差し引いた値を配列 Bに代入して 標準出力に書き出します プログラム : FORTRAN C PARAMETER 文で定数 IMAXを宣言する C 定数 IMAXはデータの個数を表す PARAMETER (IMAX=20) C 配列 A B を宣言する REAL A(IMAX),B(IMAX) C データを読みこむ C ファイルを開く C 機番は10 以降の番号を指定する C STATUSは読みこみの場合は 'OLD' を指定する C FORMはテキストファイルの場合は 'FORMATTED' を指定する OPEN(10,FILE='data05.txt',STATUS='OLD', + FORM='FORMATTED') C ここからデータを読みこむための DO ループが始まる C データの個数だけ反復する DO 11 I=1,IMAX C READ 文でデータを読みこむ 45

C 機番 10を指定する * は書式を指定しないことを示す C データファイルの各行の第 1 要素が年 C 第 2 要素が配列 Aに読みこむデータである READ(10,*) IY,A(I) C ここで DO ループ 11 が終了する 11 CONTINUE C ファイルを閉じる CLOSE(10) C 変数 S にゼロを代入する S = 0. C ここから DO ループ 21 が始まる DO 21 I=1,IMAX C 変数 S に A(I) の値を加える S = S + A(I) C ここで DO ループ 21 が終了する 21 CONTINUE C 平均値を計算する C 関数 REAL で整数型の変数を実数型に変換する AVE = S / REAL(IMAX) C ここから DO ループ 31 が始まる DO 31 I=1,IMAX C A(I) と平均値との差を計算する B(I) = A(I) - AVE C ここで DO ループ 31 が終了する 31 CONTINUE C ここからデータを書き出すための DO ループが始まる C データの個数だけ反復する DO 41 I=1,IMAX 46

C B(I) の値を標準出力に書き出す C 機番 6を指定する C 書式は '(1X,I4,1X,F5.1)' を指定する C '1X' は1 文字の空白 'I4' は4ケタの整数 C 'F5.1' は全体が5ケタで小数点以下が1ケタの実数という意味である WRITE(6,'(1X,I4,1X,F5.1)') 1990+I,B(I) C ここで DO ループ 41 が終了する 41 CONTINUE STOP END ( 参考 )C #include <stdio.h> int main(void) /* 変数 imax を宣言する 定数 imax はデータの個数を表す */ int imax=20, i, iy; /* 配列 a b を宣言する */ float a[imax], b[imax]; float aa, s, ave; /* ファイルポインタ fp を宣言する */ FILE *fp; /* データを読みこむ */ /* ファイルを開く モードは "r"( テキストファイルの読みこみ ) を指定する */ fp = fopen( "data05.txt", "r" ); /* ここからデータを読みこむための for ループが始まる データの個数だけ反復する */ for (i=0; i<=imax-1; i++) 47

/* 関数 fscanf でデータを読みこむ ファイルポインタ fp を指定する 書式は "%d %f"( 整数 浮動小数点 ) を指定する データファイルの各行の第 1 要素が年 第 2 要素が配列 a に読みこむデータである 関数から変数の値を返すときは 変数の値そのもの ( たとえば iy) ではなく その変数へのポインタ ( たとえば &iy) が返ってくることに注意 */ fscanf( fp, "%d %f", &iy, &aa ); a[i] = aa; /* ファイルを閉じる */ fclose( fp ); /* 変数 s にゼロを代入する */ s = 0.; /* ここから for ループが始まる */ for (i=0; i<=imax-1; i++) /* 変数 s に a[i] の値を加える */ s = s + a[i]; /* 平均値を計算する */ ave = s / imax; /* ここから for ループが始まる */ for (i=0; i<=imax-1; i++) /* a[i] と平均値との差を計算する */ b[i] = a[i] - ave; 48

/* 結果を書き出す */ /* ここからデータを書き出すための for ループが始まる データの個数だけ反復する */ for (i=1; i<=imax; i++) /* b[i] の値を標準出力に書き出す 書式は " %4d %5.1f" を指定する "%4d" は 4 ケタの整数 "%5.1f" は全体が 5 ケタで小数点以下が 1 ケタの浮動小数点という意味である */ printf( " %4d %5.1f\n", 1990+i, b[i-1] ); return 0; 実行例 : /home/snaoki> f77 prog05_2.f /home/snaoki>./a.out 1991 0.0 1992 0.5 1993-0.1 < 中略 > 2010 0.7 計算結果を標準出力ではなくファイルに書き出すこともできます FORTRAN の場合 データを読みこむ場 合と同様に OPEN 文を使ってファイルを開きます それぞれの値を書き出すときは 標準出力の場合と同様 に WRITE 文を使います プログラム : FORTRAN C PARAMETER 文で定数 IMAXを宣言する C 定数 IMAXはデータの個数を表す 49

PARAMETER (IMAX=20) C 配列 A B を宣言する REAL A(IMAX),B(IMAX) C データを読みこむ C ファイルを開く C 機番は10 以降の番号を指定する C STATUSは読みこみの場合は 'OLD' を指定する C FORMはテキストファイルの場合は 'FORMATTED' を指定する OPEN(10,FILE='data05.txt',STATUS='OLD', + FORM='FORMATTED') C ここからデータを読みこむための DO ループが始まる C データの個数だけ反復する DO 11 I=1,IMAX C READ 文でデータを読みこむ C 機番 10を指定する * は書式を指定しないことを示す C データファイルの各行の第 1 要素が年 C 第 2 要素が配列 Aに読みこむデータである READ(10,*) IY,A(I) C ここで DO ループ 11 が終了する 11 CONTINUE C ファイルを閉じる CLOSE(10) C 変数 S にゼロを代入する S = 0. C ここから DO ループ 21 が始まる DO 21 I=1,IMAX C 変数 S に A(I) の値を加える S = S + A(I) C ここで DO ループ 21 が終了する 50

21 CONTINUE C 平均値を計算する C 関数 REAL で整数型の変数を実数型に変換する AVE = S / REAL(IMAX) C ここから DO ループ 31 が始まる DO 31 I=1,IMAX C A(I) と平均値との差を計算する B(I) = A(I) - AVE C ここで DO ループ 31 が終了する 31 CONTINUE C ファイルを開く C 機番は10 以降の番号を指定する C STATUSは書き出しの場合は 'UNKNOWN' を指定する C FORMはテキストファイルの場合は 'FORMATTED' を指定する OPEN(10,FILE='output.txt',STATUS='UNKNOWN', + FORM='FORMATTED') C ここからデータを書き出すための DO ループが始まる C データの個数だけ反復する DO 41 I=1,IMAX C B(I) の値を機番 10で指定されたファイルに書き出す C 書式は '(1X,I4,1X,F5.1)' を指定する C '1X' は1 文字の空白 'I4' は4ケタの整数 C 'F5.1' は全体が5ケタで小数点以下が1ケタの実数という意味である WRITE(10,'(1X,I4,1X,F5.1)') 1990+I,B(I) C ここで DO ループ 41 が終了する 41 CONTINUE C ファイルを閉じる CLOSE(10) STOP END 51

( 参考 )C #include <stdio.h> int main(void) /* 変数 imax を宣言する 定数 imax はデータの個数を表す */ int imax=20, i, iy; /* 配列 a b を宣言する */ float a[imax], b[imax]; float aa, s, ave; /* ファイルポインタ fp を宣言する */ FILE *fp; /* データを読みこむ */ /* ファイルを開く モードは "r"( テキストファイルの読みこみ ) を指定する */ fp = fopen( "data05.txt", "r" ); /* ここからデータを読みこむための for ループが始まる データの個数だけ反復する */ for (i=0; i<=imax-1; i++) /* 関数 fscanf でデータを読みこむ ファイルポインタ fp を指定する 書式は "%d %f"( 整数 浮動小数点 ) を指定する データファイルの各行の第 1 要素が年 第 2 要素が配列 a に読みこむデータである 関数から変数の値を返すときは 変数の値そのもの ( たとえば iy) ではなく その変数へのポインタ ( たとえば &iy) が返ってくることに注意 */ fscanf( fp, "%d %f", &iy, &aa ); a[i] = aa; 52

/* ファイルを閉じる */ fclose( fp ); /* 変数 s にゼロを代入する */ s = 0.; /* ここから for ループが始まる */ for (i=0; i<=imax-1; i++) /* 変数 s に a[i] の値を加える */ s = s + a[i]; /* 平均値を計算する */ ave = s / imax; /* ここから for ループが始まる */ for (i=0; i<=imax-1; i++) /* a[i] と平均値との差を計算する */ b[i] = a[i] - ave; /* 結果を書き出す */ /* ファイルを開く モードは "w"( テキストファイルへの書き出し ) を指定する */ fp = fopen( "output.txt", "w" ); /* ここからデータを書き出すための for ループが始まる データの個数だけ反復する */ 53

for (i=1; i<=imax; i++) /* b[i] の値をファイルポインタ fp で指定されたファイルに書き出す 書式は " %4d %5.1f" を指定する "%4d" は 4 ケタの整数 "%5.1f" は全体が 5 ケタで小数点以下が 1 ケタの浮動小数点という意味である */ fprintf( fp, " %4d %5.1f\n", 1990+i, b[i-1] ); /* ファイルを閉じる */ fclose( fp ); return 0; 実行例 : /home/snaoki> f77 prog05_3.f /home/snaoki>./a.out /home/snaoki> cat output.txt 1991 0.0 1992 0.5 1993-0.1 < 中略 > 2010 0.7 課題 : データファイル temp_sapporo.txt prec_sapporo.txt snow_sapporo.txt は それぞれ 1981~2010 年の札幌における冬季 ( 前年 12 月 ~2 月 ) の気温 降水量 最大積雪深 ( 気象庁による観測値 ) である これらのデータを読みこんで 気温と最大積雪深との間の相関係数と 降水量と最大積雪深との間の相関係数を計算し標準出力に書きだすプログラムを作成せよ (report05_1.f[.c] report05_2.f[.c]) 余裕があれば 同様の解析を新潟のデータファイル (temp_niigata.txt prec_niigata.txt snow_niigata.txt) についても試みよ ( ファイルを開くときのファイル名の指定を変えるだけでできるはずである )( 新潟については提出不要 ) 54

気温と最大積雪深 ( 札幌 ) 降水量と最大積雪深 ( 札幌 ) ( 参考 ) 相関係数相関係数は2つの確率変数の関係性を定量的に表す統計学的な指標である 相関係数は-1から+1までの値をとる 相関係数が正であるということは 一方の確率変数が大きくなるほど もう一方の確率変数も大きくなる傾向があることを示している 負の場合はこの逆であり ゼロの場合は相関がないということになる 2 組の数値からなるデータ列 (x i, y i )(i=1, 2,, n) における x と y の相関係数 r は で定義される ただし 55