# Print a Multiplication Table: Revisited

 WARNING: This example assumes the output is sent to a printer, and as a result, every formatted output contains printer control.

### Problem Statement

We shall redo the multiplication table problem using only one format for printing the whole table.

Write a program to print the multiplication table in the following form:

```         1    1    2    2    3    3    4    4    5    5    6    6    7    7
....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9
2*1= 2  2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
:
:
8*1= 8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72
9*1= 9  9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
```

### Solution

```PROGRAM  Multiplication_Table
IMPLICIT  NONE
INTEGER, PARAMETER :: MAX = 9
INTEGER            :: i, j
CHARACTER(LEN=80)  :: FORMAT

FORMAT = "(9(2X, I1, A, I1, A, I2))"
WRITE(*,FORMAT) ((i, '*', j, '=', i*j, j = 1, MAX), i = 1, MAX)
END PROGRAM  Multiplication_Table
```

### Program Input and Output

The output of the program is:
```         1    1    2    2    3    3    4    4    5    5    6    6    7    7
....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9
2*1= 2  2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
3*1= 3  3*2= 6  3*3= 9  3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27
4*1= 4  4*2= 8  4*3=12  4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36
5*1= 5  5*2=10  5*3=15  5*4=20  5*5=25  5*6=30  5*7=35  5*8=40  5*9=45
6*1= 6  6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  6*7=42  6*8=48  6*9=54
7*1= 7  7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  7*8=56  7*9=63
8*1= 8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72
9*1= 9  9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
```

### Discussion

• After learning Scanning a Format: III , this problem becomes obvious. The original program contains a DO loop as follows:
```DO i = 1, MAX
WRITE(*,FORMAT) (i, '*', j, '=', i*j, j = 1, MAX)
END DO
```
This becomes unnecessary due to the third part of format scanning. This loop can be rewritten as follows:
```FORMAT = "(9(2X, I1, A, I1, A, I2))"

WRITE(*,FORMAT) ((i, '*', j, '=', i*j, j = 1, MAX), i = 1, MAX)
```
Now we have nested implied DO loops, which generates the same results as those of the DO loop.
• But, why does the original format still work? This is because of the new format scanning rule. After printing the first row of nine products, all edit descriptors of that format have been used and rescanning is started. Before rescanning, Fortran terminates the current line and has it printed. Then, Fortran reuses the format at 9(, which is essentially the complete format. As a result, this program generates the same result as the previous one.