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

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

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

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

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

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

演算増幅器

Microsoft PowerPoint - prog06.ppt

作図コマンド : pscoast -R125/148/30/46 -JM15c -B5g5 -Di -W5 -S235 -X6c -Y4c > test.ps 作図例 : 2 分布図の作成 2.1 点を描く 地点の分布を作図するときは たとえば以下のように行います > pscoast -R125/1

gengo1-12

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

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

gengo1-12

プログラミング基礎

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

gengo1-12

Microsoft PowerPoint - prog04.ppt

memo

PowerPoint Presentation

情報処理演習 B8クラス

cp-7. 配列

演習2

Microsoft PowerPoint - kougi2.ppt

ex01.dvi

PowerPoint Presentation

Microsoft PowerPoint - kougi6.ppt

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

Microsoft Word - DF-Salford解説09.doc

2006年10月5日(木)実施

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

gengo1-2

フローチャートの書き方

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

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

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

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

Prog1_12th

02: 変数と標準入出力

GrADS の使い方 GrADS(Grid Analysis and Display System) は おもに 客観解析データのような格子点データを地図上に作図するために使われるアプリケーションです 全球スケールの気象を扱う分野で広く使われています GrADS は Unix 系の OS 上でよく利

Microsoft PowerPoint - kougi4.ppt

演習1

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

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

memo

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

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

02: 変数と標準入出力

講習No.1

スライド 1

ex01.dvi

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

Microsoft Word - Training10_プリプロセッサ.docx

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

memo

※ ポイント ※

Microsoft Word - no11.docx

Microsoft PowerPoint - lec10.ppt

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

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

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

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

memo

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft Word - 3new.doc

プログラミング実習I

PowerPoint Presentation

数値計算

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

Microsoft PowerPoint - prog05.ppt

Microsoft Word - format_amedas.doc

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

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Taro-リストⅢ(公開版).jtd

講習No.12

8 / 0 1 i++ i 1 i-- i C !!! C 2

gengo1-10

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - 11.pptx

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

memo

: CR (0x0d) LF (0x0a) line separator CR Mac LF UNIX CR+LF MS-DOS WINDOWS Japan Advanced Institute of Science and Technology

memo

ファイル入出力

物質工学科 田中晋

C言語によるアルゴリズムとデータ構造

PowerPoint プレゼンテーション

Taro-再帰関数Ⅲ(公開版).jtd

スクールCOBOL2002

Microsoft PowerPoint - KHPCSS pptx

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

PowerPoint Presentation

C言語入門

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

Microsoft PowerPoint - lec4.ppt

Microsoft Word - no15.docx

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

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Transcription:

地上気象観測データの解析 1 AMeDAS データの解析 研究を進めるにあたって データ解析用のプログラムを自分で作成する必要が生じることがあります ここでは 自分で FORTRAN または C でプログラムを作成し CD-ROM に入った気象観測データ ( 気象庁による AMeDAS の観測データ ) を読みこんで解析します データを読みこむためのサブルーチンや関数はあらかじめ作成してあります それらのサブルーチンや関数を使って自分でプログラムを書いてデータを解析していきます まず サンプルプログラムを実行してみます 具体的には /home/snaoki> f77 sample.f ameadas_sub.f とします sample.f がプログラムの本体で その中で使われているデータの読みこみ用のサブルーチンは ameadas_sub.f に書かれています C の場合は /home/snaoki> cc sample.c ameadas_sub.c -lf2c とします ameadas_sub.c は FORTRAN で作成したプログラムを自動で変換して作成したため -lf2c というオプションをつけて専用のライブラリを参照します コンパイルが成功すると実行ファイルが生成されているはずです 生成されていることを確認したら実行します 地点番号と年月日を聞かれますので 入力してください 府中の地点番号は 44116 です /home/snaoki>./a.out Station No.? 44116 Year, Month, Day? 2009,1,2 Reading data... Output was written to file 'output.txt'. 結果は output.txt というファイルに書き出されますので cat などのコマンドで中身を確認してください /home/snaoki> cat output.txt Station No. = 44116, Date = Jan. 2, 2009 Time Precip. Dir. Speed S.D. Temp. hr mm m/s hr C 1 0 C 0 0.0 1.2 2 0 W 1 0.0 0.4 3 0 NW 1 0.0-0.5 1

< 中略 > 24 0 NNE 2 0.0 2.9 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMDID です AMeDAS のデータを読みこむためのサブルーチンは AMDHR です サブルーチン AMDHR は IYY IMM で指定した年 月について index.txt で指定したすべての観測地点のデータを読みこみます サブルーチン AMDID と AMDHR は amedas_sub.f の中に書いてあるので コンパイルのときに このファイル名を指定すれば 自分でサブルーチンを作る必要はありません プログラム : FORTRAN C 配列の大きさ : IHXは1 日の時間数 (=24) IDXは1 月の日数 (=31) C NXは地点数である C NXには 観測地点リストindex.txtに載っている C 観測地点数と等しい値を指定する PARAMETER (IHX=24,IDX=31,NX=146) C 配列 ( 入力データ ) の宣言 : C ISTA (NX): 観測地点番号 東京 ( 大手町 ) は44132など C ITYPE (IDX,NX): 観測地点の種類 C 降水量のみの場合は1 4 要素の場合は4 C データが存在しない場合は0 C XX (NX): 観測地点の経度 [ 度 ] C YY (NX): 観測地点の緯度 [ 度 ] C IR (IHX,IDX,NX): 降水量 [ 時間 ] C ID (IHX,IDX,NX): 風向 [16 方位 北北東 =1 東 =4] C IW (IHX,IDX,NX): 風速 [m/s] C S (IHX,IDX,NX): 日照時間 [ 時間 ] C T (IHX,IDX,NX): 気温 [ ] INTEGER ISTA(NX),ITYPE(IDX,NX), + IR(IHX,IDX,NX),ID(IHX,IDX,NX),IW(IHX,IDX,NX) REAL XX(NX),YY(NX),HH(NX), + S(IHX,IDX,NX),T(IHX,IDX,NX) C 欠損値 : データが無効のとき IMISS RMISSで指定された値が格納される C 整数型の場合はIMISS 実数型の場合はRMISSである PARAMETER (IMISS=999,RMISS=999.9) C サブルーチン AMDID によって 観測地点リストを読みこむ 2

CALL AMDID (NX,ISTA,XX,YY,HH) C 年月日 時刻を指定する C 入力を求めるメッセージを標準出力に書き出す WRITE(6,*) 'Year, Month, Day, Hour?' C READ 文で入力値を読みこむ READ (5,*) IYY,IMM,IDD,IHH C サブルーチンAMDHRによって C 指定された年 月の観測データ ( 時別値 ) を読むこむ C サブルーチンAMDHRは IYY IMMで指定された年 月について C データを読みこむ CALL AMDHR + (IHX,IDX,NX,ISTA,IYY,IMM,IMISS,RMISS,ITYPE,IR,ID,IW,S,T) C 出力ファイルを開く C 機番は10 以降の番号を指定する C STATUSは書き出しの場合は 'UNKNOWN' を指定する C FORMはテキストファイルの場合は 'FORMATTED' を指定する OPEN(10,FILE='output.txt',STATUS='UNKNOWN', + FORM='FORMATTED') C ここから DO ループ 11 が始まる C 各地点について 結果を出力する DO 11 N=1,NX C データが存在する場合だけ つまり ITYPE(ID,N) がゼロでない場合だけ C 結果を出力する IF (ITYPE(IDD,N).NE.0) THEN C 地点番号 緯度 経度 降水量 気温を出力する WRITE(10,'(1X,I5,1X,F8.3,1X,F8.3,1X,I3,1X,F5.1)') + ISTA(N),YY(N),XX(N),IR(IHH,IDD,N),T(IHH,IDD,N) ENDIF C ここで DO ループ 11 が終了する 11 CONTINUE 3

C ファイルを閉じる CLOSE(10) STOP END ( 参考 )C #include <stdio.h> /*======== 関数プロトタイプ ========*/ /* プログラムの中で別に作成した関数を参照するときは 関数プロトタイプを作成する */ int amdhr( int ihmax, int idmax, int nmax, int *ista, int iyy, int imm, int imiss, float rmiss, int *itype, int *ir, int *id, int *iw, float *s, float *t ); int amdid( int nmax, int *ista, float *xx, float *yy, float *hh ); /*======== main 関数 ========*/ /* プログラムは main 関数から実行される */ int main( void ) { /* 配列の大きさ : ihmax は 1 日の時間数 (=24) idmax は 1 月の日数 (=31) nmax は地点数である nmax には 観測地点リスト index.txt に載っている観測地点数と等しい値を指定する */ int ihmax=24, idmax=31, nmax=146; /* 配列 ( 入力データ ) の宣言 : ista [nmax]: 観測地点番号 東京 ( 大手町 ) は 44132 など itype [idmax, nmax]: 観測地点の種類 降水量のみの場合は 1 4 要素の場合は 4 データが存在しない場合は 0 xx [nmax]: 観測地点の経度 [ 度 ] yy [nmax]: 観測地点の緯度 [ 度 ] ir [ihmax, idmax, nmax]: 降水量 [ 時間 ] id [ihmax, idmax, nmax]: 風向 [16 方位 北北東 =1 東 =4] 4

iw [ihmax, idmax, nmax]: 風速 [m/s] s [ihmax, idmax, nmax]: 日照時間 [ 時間 ] t [ihmax, idmax, nmax]: 気温 [ ] */ static int ista[222],itype[31*222], id[24*31*222], ir[24*31*222], iw[24*31*222]; static float xx[222], yy[222], hh[222], s[24*31*222], t[24*31*222]; int ihh, idd, imm, iyy, n, status; FILE *fp; /* 欠損値 : データが無効のとき imiss rmiss で指定された値が格納される 整数型の場合は imiss 浮動小数点型の場合は rmiss である */ int imiss = 999; float rmiss = 999.9; /* サブルーチン amdid によって 観測地点リストを読みこむ */ status = amdid (nmax, ista, xx, yy, hh); /* 年月日 時刻を指定する 入力を求めるメッセージを標準出力に書き出す */ printf( "%s\n", "Year, Month, Day, Hour?" ); /* scanf 文で入力値を読みこむ */ scanf( "%d,%d,%d,%d", &iyy, &imm, &idd, &ihh ); /* 関数 amdhr によって 指定された年 月の観測データ ( 時別値 ) を読むこむ 関数 amdhr は iyy imm で指定された年 月についてデータを読みこむ */ status = amdhr (ihmax, idmax, nmax, ista, iyy, imm, imiss, rmiss, itype, ir, id, iw, s, t); /* 出力ファイルを開く モードは "w"( テキストファイルへの書き出し ) を指定する */ fp = fopen( "output.txt", "w" ); /* ここから for ループが始まる 各地点について 結果を出力する */ for (n=1; n<=nmax; n++) 5

{ /* データが存在する場合だけ つまり itype[(idd-1)+(n-1)*idmax] がゼロでない場合だけ 結果を出力する */ if (itype[(idd-1)+(n-1)*idmax]!= 0){ /* 地点番号 緯度 経度 降水量 気温を出力する */ fprintf( fp, " %5d %8.3f %8.3f %3d %5.1f\n", ista[n-1], yy[n-1], xx[n-1], ir[(ihh-1)+(idd-1)*ihmax+(n-1)*idmax*ihmax], t[(ihh-1)+(idd-1)*ihmax+(n-1)*idmax*ihmax] ); /* ここで for ループが終了する */ /* ファイルを閉じる */ fclose( fp ); return 0; 実行例 : /home/snaoki> f77 prog01_1.f amedas_sub.f /home/snaoki>./a.out Year, Month, Day, Hour? 2009,1,2,6 /home/snaoki> cat output.txt 40041 36.867 140.640 0 999.9 40046 36.840 140.775 0 3.5 40061 36.775 140.350 0-4.4 < 中略 > 46211 35.175 139.633 0 1.7 さらに 指定した年月日における各地点の日降水量を計算するプログラムを作成します 与えられたデータ は時別値なので 自分でプログラムを書いて 24 時間分の降水量を合計します 6

プログラム : FORTRAN C 配列の大きさ : IHXは1 日の時間数 (=24) IDXは1 月の日数 (=31) C NXは地点数である C NXには 観測地点リストindex.txtに載っている C 観測地点数と等しい値を指定する PARAMETER (IHX=24,IDX=31,NX=146) C 配列 ( 入力データ ) の宣言 : C ISTA (NX): 観測地点番号 東京 ( 大手町 ) は44132など C ITYPE (IDX,NX): 観測地点の種類 C 降水量のみの場合は1 4 要素の場合は4 C データが存在しない場合は0 C XX (NX): 観測地点の経度 [ 度 ] C YY (NX): 観測地点の緯度 [ 度 ] C IR (IHX,IDX,NX): 降水量 [ 時間 ] C ID (IHX,IDX,NX): 風向 [16 方位 北北東 =1 東 =4] C IW (IHX,IDX,NX): 風速 [m/s] C S (IHX,IDX,NX): 日照時間 [ 時間 ] C T (IHX,IDX,NX): 気温 [ ] INTEGER ISTA(NX),ITYPE(IDX,NX), + IR(IHX,IDX,NX),ID(IHX,IDX,NX),IW(IHX,IDX,NX) REAL XX(NX),YY(NX),HH(NX), + S(IHX,IDX,NX),T(IHX,IDX,NX) C 配列 ( 出力データ ) の宣言 : C IRD (NX): 指定した日の日降水量 [mm] INTEGER IRD(NX) C 欠損値 : データが無効のとき IMISS RMISSで指定された値が格納される C 整数型の場合はIMISS 実数型の場合はRMISSである PARAMETER (IMISS=999,RMISS=999.9) C サブルーチン AMDID によって 観測地点リストを読みこむ CALL AMDID (NX,ISTA,XX,YY,HH) C 年月日を指定する C 入力を求めるメッセージを標準出力に書き出す WRITE(6,*) 'Year, Month, Day?' 7

C READ 文で入力値を読みこむ READ (5,*) IYY,IMM,IDD C サブルーチンAMDHRによって C 指定された年 月の観測データ ( 時別値 ) を読むこむ C サブルーチンAMDHRは IYY IMMで指定された年 月について C データを読みこむ CALL AMDHR + (IHX,IDX,NX,ISTA,IYY,IMM,IMISS,RMISS,ITYPE,IR,ID,IW,S,T) C ここから DO ループ 11 が始まる C 各地点について 日降水量を計算する DO 11 N=1,NX C 出力データを格納する配列に あらかじめ欠損値を入れておく IRD(N) = IMISS C データが存在する場合だけ つまり ITYPE(ID,N) がゼロでない場合だけ C 計算を実行する IF (ITYPE(IDD,N).NE.0) THEN C 和の値にゼロを代入する ISUM = 0 C ここから DO ループ 21 が始まる C 各地点について 1 時から 24 時までの時間降水量を合計する DO 21 IHH=1,IHX C 欠損値を見つけたときはその地点の計算を中止する C GO TO 文で DO ループから出る IF (IR(IHH,IDD,N).EQ.IMISS) GO TO 29 ISUM = ISUM + IR(IHH,IDD,N) C ここで DO ループ 21 が終了する 21 CONTINUE C 合計値を ird に代入する IRD(N) = ISUM 8

29 CONTINUE ENDIF C ここで DO ループ 11 が終了する 11 CONTINUE C 出力ファイルを開く C 機番は10 以降の番号を指定する C STATUSは書き出しの場合は 'UNKNOWN' を指定する C FORMはテキストファイルの場合は 'FORMATTED' を指定する OPEN(10,FILE='output.txt',STATUS='UNKNOWN', + FORM='FORMATTED') C ここから DO ループ 31 が始まる C 各地点について 結果を出力する DO 31 N=1,NX C データが存在する場合だけ つまり ITYPE(ID,N) がゼロでない場合だけ C 結果を出力する IF (ITYPE(IDD,N).NE.0) THEN C 地点番号 緯度 経度 降水量を出力する WRITE(10,'(1X,I5,1X,F8.3,1X,F8.3,1X,I3)') + ISTA(N),YY(N),XX(N),IRD(N) ENDIF C ここで DO ループ 31 が終了する 31 CONTINUE C ファイルを閉じる CLOSE(10) STOP END ( 参考 )C #include <stdio.h> 9

/*======== 関数プロトタイプ ========*/ /* プログラムの中で別に作成した関数を参照するときは 関数プロトタイプを作成する */ int amdhr( int ihmax, int idmax, int nmax, int *ista, int iyy, int imm, int imiss, float rmiss, int *itype, int *ir, int *id, int *iw, float *s, float *t ); int amdid( int nmax, int *ista, float *xx, float *yy, float *hh ); /*======== main 関数 ========*/ /* プログラムは main 関数から実行される */ int main( void ) { /* 配列の大きさ : ihmax は 1 日の時間数 (=24) idmax は 1 月の日数 (=31) nmax は地点数である nmax には 観測地点リスト index.txt に載っている観測地点数と等しい値を指定する */ int ihmax=24, idmax=31, nmax=146; /* 配列 ( 入力データ ) の宣言 : ista [nmax]: 観測地点番号 東京 ( 大手町 ) は 44132 など itype [idmax, nmax]: 観測地点の種類 降水量のみの場合は 1 4 要素の場合は 4 データが存在しない場合は 0 xx [nmax]: 観測地点の経度 [ 度 ] yy [nmax]: 観測地点の緯度 [ 度 ] ir [ihmax, idmax, nmax]: 降水量 [ 時間 ] id [ihmax, idmax, nmax]: 風向 [16 方位 北北東 =1 東 =4] iw [ihmax, idmax, nmax]: 風速 [m/s] s [ihmax, idmax, nmax]: 日照時間 [ 時間 ] t [ihmax, idmax, nmax]: 気温 [ ] */ static int ista[222],itype[31*222], id[24*31*222], ir[24*31*222], iw[24*31*222]; static float xx[222], yy[222], hh[222], s[24*31*222], t[24*31*222]; /* 配列 ( 出力データ ) の宣言 : 10

ird [nmax]: 指定した日の日降水量 [mm] */ static int ird[222]; int ihh, idd, imm, iyy, n, isum, status; FILE *fp; /* 欠損値 : データが無効のとき imiss rmiss で指定された値が格納される 整数型の場合は imiss 浮動小数点型の場合は rmiss である */ int imiss = 999; float rmiss = 999.9; /* サブルーチン amdid によって 観測地点リストを読みこむ */ status = amdid (nmax, ista, xx, yy, hh); /* 年月日を指定する 入力を求めるメッセージを標準出力に書き出す */ printf( "%s\n", "Year, Month, Day?" ); /* scanf 文で入力値を読みこむ */ scanf( "%d,%d,%d", &iyy, &imm, &idd ); /* 関数 amdhr によって 指定された年 月の観測データ ( 時別値 ) を読むこむ 関数 amdhr は iyy imm で指定された年 月についてデータを読みこむ */ status = amdhr (ihmax, idmax, nmax, ista, iyy, imm, imiss, rmiss, itype, ir, id, iw, s, t); /* ここから for ループが始まる 各地点について 日降水量を計算する */ for (n=1; n<=nmax; n++) { /* 出力データを格納する配列に あらかじめ欠損値を入れておく */ ird[n-1] = imiss; /* データが存在する場合だけ つまり itype[(idd-1)+(n-1)*idmax] がゼロでない場合だけ 計算を実行する */ if (itype[(idd-1)+(n-1)*idmax]!= 0){ 11

/* 和の値にゼロを代入する */ isum = 0; /* ここから for ループが始まる 各地点について 1 時から 24 時までの時間降水量を合計する */ for (ihh=1; ihh<=ihmax; ihh++) { /* 欠損値を見つけたときはその地点の計算を中止する break 文で for ループから出る */ if (ir[(ihh-1)+(idd-1)*ihmax+(n-1)*idmax*ihmax] == imiss){ break; isum = isum + ir[(ihh-1)+(idd-1)*ihmax+(n-1)*idmax*ihmax]; /* ここで for ループが終了する */ /* 欠損値を見つけたときはその地点の計算を中止する break 文で for ループから出たときは ird に isum を代入しない */ if (ir[(ihh-1)+(idd-1)*ihmax+(n-1)*idmax*ihmax]!= imiss){ /* 合計値を ird に代入する */ ird[n-1] = isum; /* ここで for ループが終了する */ /* 出力ファイルを開く モードは "w"( テキストファイルへの書き出し ) を指定する */ fp = fopen( "output.txt", "w" ); /* ここから for ループが始まる 各地点について 結果を出力する */ for (n=1; n<=nmax; n++) 12

{ /* データが存在する場合だけ つまり itype[(idd-1)+(n-1)*idmax] がゼロでない場合だけ 結果を出力する */ if (itype[(idd-1)+(n-1)*idmax]!= 0){ /* 地点番号 緯度 経度 降水量を出力する */ fprintf( fp, " %5d %8.3f %8.3f %3d\n", ista[n-1], yy[n-1], xx[n-1], ird[n-1] ); /* ここで for ループが終了する */ /* ファイルを閉じる */ fclose( fp ); return 0; 実行例 : /home/snaoki> f77 prog01_2.f amedas_sub.f /home/snaoki>./a.out Year, Month, Day? 2009,1,2 /home/snaoki> cat output.txt 40041 36.867 140.640 0 40046 36.840 140.775 0 40061 36.775 140.350 0 < 中略 > 46211 35.175 139.633 0 課題 : 関東地方の各地点における 2009 年 1 月の月降水量と月平均気温を AMeDAS の時別値データから計算 し 結果を GMT のようなアプリケーションを用いて地図上にプロットして提出せよ 13