program sample09
  implicit none
!--------------------------------------------------------------------
  integer, parameter :: n = 3
  integer :: i
  real(8) :: x(1:n)
  real(8) :: xsum
  real(8) :: xmin, xmax
!--------------------------------------------------------------------
  x(1) = 10.0d0
  x(2) = 20.0d0
  x(3) = 30.0d0
  write(*,'(a,3f5.1)') 'x(i) = ', (x(i), i = 1, 3)
!--------------------------------------------------------------------
! 関数とサブルーチンを使用した配列の和・最小・最大の計算と出力
  write(*,'(a,f5.1)') 'sum of x = ', xsum(x,n) ! 関数による和の計算と出力
  call minmax_x(xmin,xmax,x,n) ! サブルーチン呼び出し
  write(*,'(a,f5.1)') 'min of x = ', xmin ! 最小値出力
  write(*,'(a,f5.1)') 'max of x = ', xmax ! 最大値出力
! f90の組込み関数を使用した配列の和・最小・最大の計算と出力
  write(*,'(a,f5.1)') 'sum of x = ', sum(x)
  write(*,'(a,f5.1)') 'min of x = ', minval(x)
  write(*,'(a,f5.1)') 'max of x = ', maxval(x)
end program sample09

!********************************************************************
! 配列の和を求める関数
real(8) function xsum(x,n)
  implicit none
  integer, intent(in) :: n
  real(8), intent(in) :: x(1:n)
  integer :: i
  xsum = 0.0d0
  do i = 1, n
    xsum = xsum + x(i)
  end do
end function xsum

!********************************************************************
! 配列の最小・最大を求めるサブルーチン
subroutine minmax_x(xmin,xmax,x,n)
  implicit none
  integer, intent(in) :: n
  real(8), intent(in) :: x(1:n)
  real(8), intent(out) :: xmin, xmax
  integer :: i
  xmin = x(1)
  do i = 2, n
    if (x(i) < xmin) xmin = x(i)
  end do
  xmax = x(1)
  do i = 2, n
    if (x(i) > xmax) xmax = x(i)
  end do
end subroutine minmax_x
