WARNING: This example assumes spaces are ignored for the I and F descriptors and the output is sent to a printer.
Suppose we have an input like the following. The first line gives the number of input values. Each of the input line has five fields with 10 positions each.
Write a Fortran program that reads in the above input, computes the 2-moving average, and prints the following two-column table:1 1 2 2 3 3 4 4 ....5....0....5....0....5....0....5....0....5 17 13.5 17.23 9.0 20.9 23.0 16.3 15.9 21.5 14.78 18.5 16.54 13.67 10.78 9.5 13.2 19.6 20.0
Suppose the input values are x(1), x(2) and so on. The 2-moving average is computed as follows: y(1)=(x(1)+x(2))/2, y(2)=(x(2)+x(3))/2, y(3)=(x(3)+x(4))/2 and so on. In general, y(i)=(x(i)+x(i+1))/2. If x has n entries, y will have n-1 (i.e., y(n) cannot be computed).1 1 2 2 3 3 4 4 5 ....5....0....5....0....5....0....5....0....5....0 ************************** * Data Smoothing Table * ************************** No x y No x y --- -------- -------- --- -------- -------- 1 13.50 NA 2 17.23 15.36 3 9.00 13.11 4 20.90 14.95 5 23.00 21.95 6 16.30 19.65 7 15.90 16.10 8 21.50 18.70 9 14.78 18.14 10 18.50 16.64 11 16.54 17.52 12 13.67 15.11 13 10.78 12.23 14 9.50 10.14 15 13.20 11.35 16 19.60 16.40 17 20.00 19.80
Note that the first position is always for printer control.
Click here to download this program.PROGRAM Smoothing IMPLICIT NONE INTEGER, PARAMETER :: MAX_SIZE = 20 REAL, DIMENSION(1:MAX_SIZE) :: x, y INTEGER :: Number INTEGER :: i CHARACTER(LEN=10) :: TitleFormat = "(T14,A)" CHARACTER(LEN=20) :: HeadingFormat = "(T2,A,T28,A)" CHARACTER(LEN=50) :: NA_Line = "(T2,I3,F10.2,A10,I6,2F10.2)" CHARACTER(LEN=50) :: Data_Line = "(1X,I3,2F10.2,I6,2F10.2)" READ(*,"(I5)") Number READ(*,"(5F10.0)") (x(i), i=1, Number) DO i = 1, Number-1 y(i) = (x(i) + x(i+1)) / 2.0 END DO WRITE(*,TitleFormat) "**************************" WRITE(*,TitleFormat) "* Data Smoothing Table *" WRITE(*,TitleFormat) "**************************" WRITE(*,*) WRITE(*,HeadingFormat) (" No x y ", i = 1, 2) WRITE(*,HeadingFormat) ("--- -------- -------- ", i = 1, 2) WRITE(*,NA_Line) 1, x(1), "NA", 2, x(2), y(1) WRITE(*,Data_Line) (i, x(i), y(i-1), i = 3, Number) END PROGRAM Smoothing
1 1 2 2 3 3 4 4 5 ....5....0....5....0....5....0....5....0....5....0 ************************** * Data Smoothing Table * ************************** No x y No x y --- -------- -------- --- -------- -------- 1 13.50 NA 2 17.23 15.36 3 9.00 13.11 4 20.90 14.95 5 23.00 21.95 6 16.30 19.65 7 15.90 16.10 8 21.50 18.70 9 14.78 18.14 10 18.50 16.64 11 16.54 17.52 12 13.67 15.11 13 10.78 12.23 14 9.50 10.14 15 13.20 11.35 16 19.60 16.40 17 20.00 19.80
The following has the format and READ statement:1 1 2 2 3 3 4 4 5 ....5....0....5....0....5....0....5....0....5....0 No x y No x y --- -------- -------- --- -------- -------- : : :
In the above, an implied DO are used to print the column headings. Each WRITE statement prints two strings using format HeadingFormat. The first (resp., second) string is printed at position 2 (resp., 28) using A edit descriptor.CHARACTER(LEN=20) :: HeadingFormat = "(T2,A,T28,A)" WRITE(*,HeadingFormat) (" No x y ", i = 1, 2) WRITE(*,HeadingFormat) ("--- -------- -------- ", i = 1, 2)
The following are the formats and WRITE statements.1 1 2 2 3 3 4 4 5 ....5....0....5....0....5....0....5....0....5....0 1 13.50 NA 2 17.23 15.36 3 9.00 13.11 4 20.90 14.95 5 23.00 21.95 6 16.30 19.65 7 15.90 16.10 8 21.50 18.70 9 14.78 18.14 10 18.50 16.64 11 16.54 17.52 12 13.67 15.11 13 10.78 12.23 14 9.50 10.14 15 13.20 11.35 16 19.60 16.40 17 20.00 19.80
CHARACTER(LEN=50) :: NA_Line = "(T2,I3,F10.2,A10,I6,2F10.2)" CHARACTER(LEN=50) :: Data_Line = "(1X,I3,2F10.2,I6,2F10.2)" WRITE(*,NA_Line) 1, x(1), "NA", 2, x(2), y(1) WRITE(*,Data_Line) (i, x(i), y(i-1), i = 3, Number)