program enshu06d4 implicit none integer :: seireki,tsuki,joutai,bangou,kosuu real,dimension(1800) :: kion1retsu,kion1retsu_lowpass real :: souwa integer,parameter :: mado_haba=12 ! 移動平均をとるデータの数 integer,parameter :: mado_haba_half=mado_haba/2 real,dimension(-mado_haba_half:mado_haba_half) :: omomi real :: omomi_no_souwa integer :: mado_haba_hidari,mado_haba_migi,i kosuu = 0 do read(*,'(2i5,i2.2,f6.1)',iostat=joutai)bangou,seireki,tsuki, & kion1retsu(bangou) if (joutai /= 0) exit kosuu = kosuu + 1 end do if (mado_haba /= mado_haba_half*2 ) then ! 奇数個のデータを使う場合 do i = -mado_haba_half,mado_haba_half omomi(i) = 1.0 ! 全ての点を同じ「重み1」で重みつき平均をとる end do else ! 偶数個のデータを使う場合 do i = -mado_haba_half+1,mado_haba_half-1 omomi(i) = 1.0 ! 両端を除いた点は「重み1」 end do omomi(-mado_haba_half) = 0.5 ! 両端はそれぞれ「重み0.5」でとして omomi( mado_haba_half) = 0.5 ! 重みつき平均をとる end if do bangou = 1,kosuu mado_haba_hidari & ! 「窓」は左側に何個までとれるか = min(mado_haba_half,bangou-1) mado_haba_migi & ! 「窓」は右側に何個までとれるか = min(mado_haba_half,kosuu-bangou) souwa = 0.0 omomi_no_souwa = 0 do i = -mado_haba_hidari,mado_haba_migi souwa = souwa+kion1retsu(bangou+i)*omomi(i) omomi_no_souwa = omomi_no_souwa+omomi(i) end do kion1retsu_lowpass(bangou) = souwa/omomi_no_souwa write(*,'(i4,2f6.2)')bangou,kion1retsu(bangou),kion1retsu_lowpass(bangou) end do end program enshu06d4