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.
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
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
....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
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).
Note that the first position is always for printer control.
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
Click here to download this program.
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
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
--- -------- -------- --- -------- --------
:
:
:
The following has the format and READ statement:
CHARACTER(LEN=20) :: HeadingFormat = "(T2,A,T28,A)"
WRITE(*,HeadingFormat) (" No x y ", i = 1, 2)
WRITE(*,HeadingFormat) ("--- -------- -------- ", i = 1, 2)
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.
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
The following are the formats and WRITE statements.
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)