PROGRAM Summation
INTEGER, PARAMETER :: n_miles=20, stretch=5
REAL :: maxcost = TINY(0.0), cost5
REAL, DIMENSION(n_miles) :: cost = &
(/6.3, 7.6, 9.2, 3.4, 5.6, 7.23, 9.76, 6.83, 5.45, 4.56, &
4.86, 5.8, 6.4, 7.43, 7.8, 8.6, 9.25, 8.9, 8.4, 7.23/)
INTEGER :: start
DO I = 1, n_miles-stretch+1
cost5 = 0
DO J= I, I+stretch-1
cost5 = cost5 + cost(J)
END DO
IF(cost5 > maxcost)THEN
maxcost=cost5
start = I
END IF
END DO
PRINT*, &
' The most expensive ',stretch,' mile stretch is', &
' from ',start,' to ',start+stretch,' and costs ',maxcost
END PROGRAM Summation
Or, using whole array notation:
PROGRAM Summation2
INTEGER, PARAMETER :: n_miles=20, stretch=5
INTEGER, PARAMETER :: n_stretches = n_miles-stretch+1
INTEGER, DIMENSION(1) :: start ! needed for result of MAXLOC
REAL :: maxcost
REAL, DIMENSION(n_stretches) :: cost5
REAL, DIMENSION(n_miles) :: cost = &
(/6.3, 7.6, 9.2 ,3.4, 5.6, 7.23 ,9.76, 6.83, 5.45, 4.56, &
4.86, 5.8, 6.4, 7.43, 7.87, 8.6, 9.25, 8.9, 8.4, 7.23/)
DO I= 1, n_stretches
cost5(I) = SUM(cost(I:I+stretch-1))
END DO
maxcost = MAXVAL(cost5)
start = MAXLOC(cost5)
PRINT*, &
' The most expensive ',stretch,' mile stretch is', &
' from ',start,' to ',start+stretch,' and costs
',maxcost
END PROGRAM Summation2
Note that the whole array solution involves the extra storage for the array cos t5.