#include /*======== 関数プロトタイプ ========*/ /* プログラムの中で別に作成した関数を参照するときは、   関数プロトタイプを作成する。 */ 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)として宣言する。 staticでは、関数が呼ばれるごとに新たにメモリを確保するのではなく、 プログラムが終了するまで固定されたメモリを用いる。 */ static int ista[146], itype[31*146], id[24*31*146], ir[24*31*146], iw[24*31*146]; static float xx[146], yy[146], hh[146], s[24*31*146], t[24*31*146]; 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++) { /* データが存在する場合だけ、 つまり、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; }