! 2.9.f90 ! 1.1 2014/02/12 ! ! $Id: 2.9.f90 1.3 2016/10/30 02:49:35 s Exp $ program ex2_9 ! df : discount factor ! n : number of periods ! pv : present value ! r : interest rate ! sumdf : sum of df ! x : cash flow implicit none integer :: k, n1, n2 real(8) :: pv1, pv2, r, sumdf1, sumdf2, x integer, dimension(100) :: i real(8), dimension(100) :: df1, df2 ! input r = 0.05d0 pv1 = 20.0d3 n1 = 20 n2 = 5 i(1:100) = (/(k, k = 1, 100)/) ! calculate df1(1:n1) = 1.0d0 / (1.0d0 + r) ** i(1:n1) df2(1:n2) = 1.0d0 / (1.0d0 + r) ** i(1:n2) ! sumdf1 = sum(df1(1:n1)) sumdf2 = sum(df2(1:n2)) x = pv1 / sumdf1 pv2 = x * sumdf2 ! output print '(a10, i10)', 'pv($)=', nint(pv1) print '(a10, i10)', 'n1=', n1 print '(a10, i10)', 'n2=', n2 print '(a10, (20f5.2))', 'r=', r print '(a10, (20i5))', 'i=', (i(k), k = 1, n1) print '(a10, (20f5.2))', 'df1=', (df1(k), k = 1, n1) print '(a10, (20f5.2))', 'df2=', (df2(k), k = 1, n2) print '(a20, f10.1)', 'sum of df1=', sumdf1 print '(a20, f10.1)', 'sum of df2=', sumdf2 print '(a20, i10)', 'cost a year($)=', nint(x) print '(a20, i10)', 'pv of the roof($)=', nint(pv2) stop end program ex2_9 ! end of program ! ! プログラムの説明 ! ! 上のdf1の行について ! 配列の演算(四則、累乗)は、要素ごとの演算になる。 ! スカラ(添字の付いていない普通の変数と定数)は、 ! 演算する相手の配列と同じ寸法で ! 要素の値がすべてそのスカラ値をもつ ! 配列とみなして扱われる。(戸川隼人、ザ・Fortran 90/95, 1999, pp.66-67.) ! ! 配列の演算を用いて、doループを用いずにdfの計算を行った。 ! ! 関数sumは、配列要素全部の合計が計算される。(ditto, p.76) ! 関数nintは、整数型への変換(四捨五入)(ditto, p.27) ! ! below is output ! ! pv($)= 20000 ! n1= 20 ! n2= 5 ! r= 0.05 ! i= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ! df1= 0.95 0.91 0.86 0.82 0.78 0.75 0.71 0.68 0.64 0.61 0.58 0.56 0.53 0.51 0.48 0.46 0.44 0.42 0.40 0.38 ! df2= 0.95 0.91 0.86 0.82 0.78 ! sum of df1= 12.5 ! sum of df2= 4.3 ! cost a year($)= 1605 ! pv of the roof($)= 6948 ! end of output