# Data Smoothing and Two-Column Table: Version 2

 WARNING: This example assumes spaces are ignored for the I and F descriptors and the output is sent to a printer.

### Problem Statement

We shall redo a program discussed previously in the data smoothing and two-column table. In fact, we shall modify the program using nX and Tc edit descriptors.

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.

### Solution

```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=50)            :: NA_Line       = "(T2,I3,F10.2,A10,I6,2F10.2)"
CHARACTER(LEN=50)            :: Data_Line     = "(1X,I3,2F10.2,I6,2F10.2)"
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
```

### Program Input and Output

The output of the program is:
```         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
```

### Discussion

• Most ingredients used in this program have been discussed previously. Therefore, we shall only focus on printing the two-column table.
• To print the table heading, we notice that the same heading is used twice, one at position 2 and the other position 28.
```         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.
• To print the table data, we need a printer control 1X, followed by three positions for the integer I3, followed by two REAL numbers printed using F10.2. Note that there are three spaces between the left and the right parts. Thus, the integer in the right part uses I6 rather than I3. But, you can change this to 3X,I3. Note also that the left part of the first line should contain a NA. Thus, a A10 is used.
```         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)
```