program enshu06fs
  ! バンドパスフィルターのサブルーチン版
  implicit none
  integer :: seireki,tsuki,joutai,bangou,kosuu
  real,dimension(1800) :: kion1retsu,kion1retsu_lowpass1,&
       kion1retsu_highpass1,kion1retsu_bandpass1
  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
  ! もとのデータをローパスフィルターに通す
  call my_lowpass_filter(kion1retsu,kion1retsu_lowpass1,kosuu)
  ! もとのデータをハイパスフィルターに通す
  do bangou = 1,kosuu
     kion1retsu_highpass1(bangou) = &
          kion1retsu(bangou)-kion1retsu_lowpass1(bangou)
  end do
  ! ハイパスフィルター後のデータをローパスフィルターに通す
  call my_lowpass_filter(kion1retsu_highpass1,kion1retsu_bandpass1,kosuu)
  ! 結果の出力
  do bangou = 1,kosuu
     write(*,'(i4,4f6.2)')bangou,kion1retsu(bangou), &
          kion1retsu_lowpass1(bangou),kion1retsu_highpass1(bangou) &
          ,kion1retsu_bandpass1(bangou)
  end do
contains
  subroutine my_lowpass_filter(mae,ato,data_no_kosuu)
    ! 自分と前後1つずつを使った移動平均によるローパスフィルター
    real,dimension(1800),intent(in)  :: mae ! 入力データの配列
    real,dimension(1800),intent(out) :: ato ! 出力データの配列
    integer,intent(in) :: data_no_kosuu     ! 入力データの個数
    integer :: i
    ! i = 1 のとき
    ato(1) = (mae(1)+mae(2))/2.0
    ! 1 < i < data_no_kosuu のとき
    do i = 2,data_no_kosuu-1
       ato(i) = (mae(i-1)+mae(i)+mae(i+1))/3.0
    end do
    ! i = data_no_kosuu のとき
    ato(data_no_kosuu) = (mae(data_no_kosuu-1)+mae(data_no_kosuu))/2.0
  end subroutine my_lowpass_filter
end program enshu06fs