• 締切済み

FORTRANについて質問です。

FORTRANについて質問です。 年 月 日 降水量 1976 1 1 0 1976 1 2 2.1 1976 1 3 0.2 1976 1 4 0 1976 1 5 0 1976 1 7 1.3 1976 1 8 5.1 1976 1 10 0 1976 3 1 2.3 1976 3 2 0 1976 3 3 0 1976 3 4 1.3 1976 3 6 0 : というデータが2008年12月31日まであります。 FORTRANでこのデータを、1日~5日を1旬、6日~10日を2旬、…としていきたんですが、26日以降は、28日でも29日でも、30日でも、31日でも6旬と定義します。 降水量は、それぞれ読んだ数での平均としたいんです。6旬の場合だと、28日なら26日と27日と28日の降水量を足して3で割、29日までの月なら26日、27日、28日、29日のを足して4で割る。 年 月 旬 降水量 1976 1 1 (0+2.1+0.2+0+0)/5 1976 1 2 (1.3+5.1+0)/3 1976 1 3 ’空欄’ or ’欠損値’ : : 1976 3 1 (2.3+0+0+1.2)/4 : と出力したいんですが、欠損値が多いため、どう書けばいいかわからないのですが、アドバイスくれませんか??

みんなの回答

回答No.2

大規模計算でも「配列にデータが入っているかどうか」という判定は、行列計算の際の必要メモリを減らすため等に使うようです。 このような計算に対するアルゴリズム一例。 --- ・「配列にデータが入っているかどうか」を示す整数型配列を用意する。 ・(年,月,日)の降水量を示す実数型配列を用意する。 -これらの配列次元は(年,月,日)。 ・まず、整数型配列と実数型配列を0に初期化する。 ・データ入力では、年,月,日,降水量をreadする。 -読み込んだ(年,月,日)に関し整数型配列の要素を1にする。 -読み込んだ(年,月,日)に関し実数型配列の要素に降水量を代入する。 ・出力では(年,月,旬)に関しループを回す。 -旬全体で整数型配列の和がゼロなら「空欄」と出力する。 -旬全体で整数型配列の和がゼロでないなら(実数型配列の和)/(整数型配列の和)を出力する。 --- 試しに書いてみたら38行でした。 値がない、または存在しない日付の場合常に値にはゼロが入るので、月による日数の違いの複雑な場合分けは実は必要ないです。6旬だけ31日まであるので場合わけが必要そうに思えますが、それも実は回避できます。 上の書き方ではメモリの節約にならないので、メモリを節約する書き方を検討してみるのもいいかもしれません。もちろん実用上は必要ありませんが。

  • seastar3
  • ベストアンサー率69% (99/142)
回答No.1

最初に学んだFORTRAN言語が懐かしくて応答します。 まず、旬番号を求める自作の関数を紹介します。 integer function jun6(hi) integer hi integer jun if ( hi > 25 ) then jun = 6 else jun = int( ( hi + 4 ) / 5 ) end if jun6 = jun end function データを読んだら以上のコードで即座に何巡に当たるかを決定します。 そして、グループトータルのアルゴリズムで、読んだ日付の旬番号が切り替わったタイミングで、降水量の小合計と人数で割った各旬の降水量平均を計算して出力します。保存旬番号と旬内人数と旬内合計を足し込んでいく変数を用意してプログラミングすれば完成します。

関連するQ&A

専門家に質問してみよう