
                 FUN
  The most popular computer language is BASIC, which I explained 
earlier. Now you'll learn a different computer language, called 
FORTRAN.
  Most maxicomputers and minicomputers understand both BASIC and 
FORTRAN. Some ideas are easier to express in BASIC; others are 
easier in FORTRAN.
  Most scientists and engineers on large computers use FORTRAN, 
not BASIC.
  IBM invented the first version of FORTRAN in 1957. Then came 
improvements, called FORTRAN II, FORTRAN III, and FORTRAN IV. The 
next version was called FORTRAN 77 because it was invented in 
1977. The newest version is called FORTRAN 90 because it was 
invented in 1990.
  Some computers use FORTRAN 77 or FORTRAN 90. Others still use 
FORTRAN IV or a slightly souped-up version of it (called FORTRAN 
IV-EXTENDED or FORTRAN V or WATFOR or WATFIV or FORTRAN 10).
  This chapter explains the popular FORTRAN features that work on 
practically all computers.

           Simple programs
  Here's a FORTRAN program:
      PRINT 10
10    FORMAT (1X,'CHIPMUNKS ARE CHUBBY')
      PRINT 20
20    FORMAT (1X,'GOLDFISH GIGGLE')
      PRINT 10
      END
  The top line says to print what's in line 10, so the computer 
will print CHIPMUNKS ARE CHUBBY. The next line says to print 
what's in line 20, so the computer will print GOLDFISH GIGGLE. 
The next line says to print what's in line 10, so the computer 
will print CHIPMUNKS ARE CHUBBY again.Altogether, the program 
makes the computer print:
CHIPMUNKS ARE CHUBBY
GOLDFISH GIGGLE
CHIPMUNKS ARE CHUBBY
  Notice:
Each program line is indented 6 spaces, so it begins in the 7th 
position.
Each FORMAT begins with 1X.
Each string is enclosed in apostrophes.
  You must number every line that's referred to. For example, you 
must number the FORMAT lines, since the PRINT lines refer to 
them. You don't have to number the PRINT lines.
  The bottom line of every FORTRAN program must be END.
  Different versions On PDP computers, say TYPE instead of PRINT. 
On CDC computers using TS FORTRAN, replace each apostrophe by an 
asterisk. On IBM computers, put STOP above END, so the bottom two 
lines of your program are:
      STOP
      END

                                         How to type the program 
Ask the people in your computer center how to feed a FORTRAN 
program into the computer. On some computers, you must put an 
edit number in front of each line:
00100         PRINT 10
00110   10    FORMAT (1X,'CHIPMUNKS ARE CHUBBY')
00120         PRINT 20
00130   20    FORMAT (1X,'GOLDFISH GIGGLE')
00140         PRINT 10
00150         END
                                         Some computers don't 
require you to indent each line. To indent quickly on PDP 
computers, hold down the CONTROL key, while you type the letter 
I.
                                         Be brief Each line of 
your program must be brief: no more than 72 characters, including 
the spaces at the beginning of the line.

                                                 Carriage controls
                                         The 1X at the beginning 
of each FORMAT is called the carriage control. It means: print 
the format normally.
                                         For weirder printing, 
replace the 1X by '0' or '1' or '+':
      PRINT 10
10    FORMAT (1X,'NIFTY')
      PRINT 20
20    FORMAT ('0','SAL')
      END
                                         In line 10, the 1X makes 
the computer print NIFTY normally. In line 20, the 
zero-in-apostrophes make the computer leave a blank line, then 
print SAL.
                                         The computer will print:
NIFTY

SAL
                                         Suppose you change the 
carriage control to '1':
      PRINT 10
10    FORMAT (1X,'NIFTY')
      PRINT 20
20    FORMAT ('1','SAL')
      END
If your terminal uses paper, the '1' makes the computer print SAL 
on a new page. If your terminal uses a screen instead of paper, 
the '1' makes the computer erase the screen before printing SAL.
                                         Suppose you change the 
carriage control to '+':
      PRINT 10
10    FORMAT (1X,'NIFTY')
      PRINT 20
20    FORMAT ('+','SAL')
      END
If your terminal uses paper, the '+' makes the computer print SAL 
in the same place as NIFTY, like this:
NIFTYSAL
If your terminal uses a screen instead, the computer will print 
NIFTY, but then the NIF will suddenly disappear, and you'll see 
SALTY.
  To print the symbol 0-, print 0 in the same place as -. To 
print the symbol =/, print = in the same place as /. To print 
0=-/A, print 0=A in the same place as -/. If your terminal uses 
paper, the program prints 0=-/A:
      PRINT 10
10    FORMAT (1X,'0=A')
      PRINT 20
20    FORMAT ('+','-/')
      END
  Different versions If you're using a Hazeltine terminal or CDC 
TS FORTRAN, the carriage controls won't work.

      Fancy formats
  In the format line, you can play fancy tricks.
  Multiple fields Examine this program:
      PRINT 10
10    FORMAT (1X,'JOHN','NY')
      END
The FORMAT consists of three fields: the first is the carriage 
control 1X, the second is `JOHN', and the third is `NY'. The 
computer will print JOHN and NY on the same line:
JOHNNY
  Another example:
      PRINT
10    FORMAT (1X,'EAT A',8X,'MEATBALL')
      END
The computer will print EAT A, then 8 blank spaces, then 
MEATBALL:
EAT A        MEATBALL
  This program does the same thing:
      PRINT 10
10    FORMAT (1X,'EAT A',T15,'MEATBALL')
      END
It makes the computer print EAT A, then Tab over to the 15th 
position on the line, and print MEATBALL. When the computer tabs 
to the 15th position, it considers the carriage control to be the 
first ``position''; the E in EAT is the first character the 
computer will print, and the computer considers it to be the 
second ``position''; the A in EAT is the second character the 
computer will print, and the computer considers it to be the 
third ``position''; the M in MEATBALL is the 14th character the 
computer will print, since the T15 says it is the 15th 
``position''.
  Here's another program for meatball lovers:
      PRINT 10
10    FORMAT (1X,'EAT A',1X,'MEATBALL')
The computer will print EAT A, then 1 blank space, then MEATBALL:
EAT A MEATBALL
If you say X instead of 1X, the computer will gripe.
                             Multiple records This program quotes 
Julius Caesar:
      PRINT 10
10    FORMAT (1X,'I CAME')
      PRINT 20
20    FORMAT (1X,'I SAW')
      PRINT 30
30    FORMAT (1X,'I CONQUERED')
      END
The computer will print:
I CAME
I SAW
I CONQUERED
                             This program does the same thing:
      PRINT 10
10    FORMAT (1X,'I CAME'/1X,'I SAW'/1X,'I CONQUERED')
      END
Line 10 consists of 3 records: the first is 1X,`I CAME'; the 
second is 1X,`I SAW'; the third is 1X,`I CONQUERED'. Each record 
begins with a carriage control; the records are separated by 
slashes. The computer will print each record on a separate line.
                             Example:
      PRINT 10
10    FORMAT (1X,'PLEASE'/1X,'NIBBLE'//1X,'MY'/////1X,'CHEESE')
      END
Line 10 makes the computer print several lines. The first line 
will say PLEASE. The next line will say NIBBLE. The next line 
will be blank. The next line will say MY. The next 4 lines will 
be blank. The last line will say CHEESE. So altogether, the 
computer will print:
PLEASE
NIBBLE

MY




CHEESE
                             Repeated formats The computer can 
feel very depressed:
      PRINT 10
10    FORMAT (1X,'I FEEL ',3('DOWN'))
      END
Line 10 is an abbreviation for this format:
              1X,'I FEEL ','DOWN','DOWN','DOWN'
The computer will print:
I FEEL DOWNDOWNDOWN
                             Let's burp and pray:
      PRINT 10
10    FORMAT (1X,'JACK ',2('BURPS'/1X,'MARY '),'ALSO PRAYS')
      END
Line 10 is an abbreviation for this format:
              1X,'JACK ','BURPS'/1X,'MARY ','BURPS'/1X,'MARY 
','ALSO PRAYS'
The computer will print:
JACK BURPS
MARY BURPS
MARY ALSO PRAYS
                             Double apostrophe To make the 
computer print an apostrophe, use two apostrophes next to each 
other.
      PRINT 10
10    FORMAT (1X,'MOMMY ISN''T HERE')
      END
The computer will print:
MOMMY ISN'T HERE

                  Continuation
  Some computers look at only the first 72 characters of each 
line of your program: if your line contains more than 72 
characters, it won't work.
  If you want to type a long statement, type just the first 72 
characters. On the line below, type the remaining characters, 
beginning in the 7th print position; and in the 6th print 
position type a 6:
      PRINT 10 
10    FORMAT (1X,'I LIKE ROSES IN MY TEA.'/1X,'THEY MAKE IT GLOW 
RED, LI
     6KE HOT BLOOD.')
      END
The computer will print:
I LIKE ROSES IN MY TEA.
THEY MAKE IT GLOW RED, LIKE HOT BLOOD.
A line that has a 6 in column 6 is called a continuation line, 
because it's a continuation of the line above it.
  (I suggest you put a 6 in column 6, or a * in column 6, or a $ 
in column 6. In fact, you can put any character in column 6, 
except a zero. Choose your favorite character; the computer 
doesn't care.)
  Different versions On PDP computers, put the 6 immediately 
after a controlled I, instead of in column 6:
10      FORMAT (1X,'I LIKE ROSES IN MY TEA.'/1X,'THEY MAKE IT 
GLOW RED, LI
        6KE HOT BLOOD.')
(I suggest you put a 6 after the controlled I. But you can put in 
any non-zero digit, instead of a 6.)
  On CDC computers using TS FORTRAN, type a + instead of a 6, and 
put it immediately after the edit number, with no intervening 
spaces:
00120 10 FORMAT (1X,'I LIKE ROSES IN MY TEA.'/1X,'THEY MAKE IT 
GLOW RED, LI
00130+KE HOT BLOOD.')

                      GO TO
  You can say GO TO:
10    PRINT 20
20    FORMAT (1X,'CAT')
      PRINT 30
30    FORMAT (1X,'DOG')
      GO TO 10
      END
The top line says to print what's in line 20, so the computer 
will print:
CAT
The next line says to print what's in line 30, so the computer 
will print:
DOG
The next line makes the computer go back to line 10. The computer 
will print CAT again, then DOG again, then jump back to line 10 
again. . . . The computer will try to print the words CAT and DOG 
again and again, forever.

                      STOP
  The computer understands the word STOP:
      PRINT 10
10    FORMAT (1X,'BUBBLE GUM')
      PRINT 20
20    FORMAT (1X,'SHAKESPEARE')
      STOP
      PRINT 30
30    FORMAT (1X,'DADA')
      END
The top line says to print what's in line 10, so the computer 
will print BUBBLE GUM. The next line says to print what's in line 
20, so the computer will print SHAKESPEARE. The next line says 
STOP, so the computer will stop. It will never print DADA.


                      MATH
  FORTRAN handles math rather well.

          Integers versus real numbers
  FORTRAN distinguishes between integers and real numbers. Here's 
how FORTRAN defines them. . . . 
  An integer contains no decimal point and no exponent.
IntegerNot an integerComment
-27   -27.0     An integer contains no decimal point.
50000 5E4       An integer contains no exponents.
A real number contains either a decimal point or the letter E.
Real numberNot a real number
-27.0     -27
2.35E8    235000000
5E4       50000
  The largest permissible integer is different from the largest 
permissible real:
Computer          Largest integerLargest realTiniest real
PDP-11 using FORTRAN IV          327671.7E382.9E-39
PDP-11 using FORTRAN IV-PLUS     21474836471.7E382.9E-39
PDP-10 or Honeywell    343597383671.7E382.9E-39
IBM mainframe          21474836477.2E75 5.4E-79
CDC               2814749767106552.5E3223.1E-294
  Integers are also called fixed-point numbers. Real numbers are 
called floating-point numbers.

                    Variables
  In BASIC, X can stand for a number, such as 3.7. The same is 
true in FORTRAN. A variable can be a letter (such as X) or a 
letter-followed-by-a-combination-of-letters-and-digits (such as 
FUN4U2).
  The variable must be short: no more than 6 characters. AVERAGE 
is too long: say AVERAG instead.
  If the variable begins with I, J, K, L, M, or N, it stands for 
an integer. If it begins with some other letter, it stands for a 
real number.

             Using integer variables
  Here's a simple example:
      JUNKY=-47
      PRINT 10, JUNKY
10    FORMAT (1X,I3)
      END
  Since JUNKY begins with J, it stands for an integer. The first 
line says JUNKY stands for the integer -47. The second line says 
to print JUNKY, using line 10. Line 10 explains how to print 
JUNKY. The I3 means: print it as an Integer having 3 characters. 
The computer will print:
-47
  If you change the I3 to I4, the computer will print JUNKY as an 
Integer having 4 characters. To print a total of 4 characters, 
the computer will print a blank space in front of -47, like this:
 -47
  If you change to I5, the computer will print JUNKY as an 
Integer having 5 characters, by printing two blank spaces in 
front of -47:
  -47
  If you change to I2, the computer will try to print JUNKY as an 
integer having 2 characters. But it's impossible to express -47 
by using only 2 characters. The computer will obey the format and 
print 2 characters, but will make them asterisks:
**

                                                     Another 
example:
      NUM=31.9
      PRINT 10, NUM
10    FORMAT (1X,I4)
      END
Since NUM begins with N, it stands for an integer. The program's 
top line tries to make NUM stand for 31.9; but that's impossible, 
since 31.9 isn't an integer. The computer will omit the .9 and 
make NUM stand for the integer 31. The computer will print 31, 
using an I4 format:
  31
                                                     Example:
      JOE=-5.8
      PRINT 10, JOE
10    FORMAT (1X,I4)
      END
The computer will set JOE equal to the integer -5 and print it:
  -5

  Example:
      JAIL=74
      KRIMNL=829
      PRINT 10, JAIL,KRIMNL
10    FORMAT (1X,I2,I3)
      END
Since JAIL begins with J, and KRIMNL begins with K, they're both 
integers. The computer will print JAIL and KRIMNL, using the 
format in line 10. The format says to print a 2-character 
integer, then a 3-character integer. The computer will print:
74829
If you change the format to (1X,I2,4X,I3), the computer will 
print a 2-character integer, then 4 blanks, then a 3-character 
integer:
74    829
If you change the format to ___ 
10    FORMAT (1X,'JAIL NUMBER',1X,I2,1X,'CONTAINS 
CRIMINAL',1X,I3)
the computer will print JAIL NUMBER, then a blank, then a 
2-character integer, then a blank, then CONTAINS CRIMINAL, then a 
blank, then a 3-character integer:
JAIL NUMBER 74 CONTAINS CRIMINAL 829
  Example:
      J=43
      K=75
      L=96
      M=81
      N=24
      PRINT 10, J,K,L,M,N
10    FORMAT (1X,I2,I2,I2,I2,I2)
      END
The computer will print 43, then 75, then 96, then 81, then 24:
4375968124
You can write that format more briefly:
10    FORMAT (1X,5I2)
If you change the format to (1X,5I3), the computer will print 
each integer as 3 characters ___ a blank followed by two digits:
 43 75 96 81 24
If you change the format to (1X,I3), the computer will print only 
one integer per line:
 43
 75
 96
 81
 24
If you change the format to (1X,2I3), the computer will print 2 
integers per line:
 43 75
 96 81
 24
If you change the format to (1X,'GOSH',I3,1X,'SUPERB',I3,1X,'JEEP
ERS'), the computer will print 2 integers per line:
GOSH 43 SUPERB 75 JEEPERS
GOSH 96 SUPERB 81 JEEPERS
GOSH 24 SUPERB
  To be safe, use I14 format for integers. On most computers, I14 
handles even the largest integers, and prints blank spaces 
between them.

              Using real variables
  The I format is only for integers. For real numbers, use F or G 
format instead.
  F format The F format is easy to understand:
      RADIUS=-586.39
      PRINT 10, RADIUS
10    FORMAT (1X,F7.2)
      END
Since RADIUS doesn't begin with I, J, K, L, M, or N, it stands 
for a real number. The first line says RADIUS stands for the real 
number -586.39. The second line says to print RADIUS, using the 
format in line 10. The F7.2 means: print it as a floating-point 
number having 7 characters, 2 of them after the decimal point. 
The computer will print:
-586.39
  If you change the F7.2 to a different format, the following 
chart shows what happens; in the chart, each  represents a blank 
space:
FormatWhat the computer printsComment
F8.2  -586.39          To print 8 characters instead of 7,
                        it prints a blank space at the beginning.

F8.3  -586.390          To print 3 characters after the decimal 
point
                        instead of 2, it prints a zero at the 
end.

F8.1  -586.4          To print 1 character after the decimal 
point
                        instead of 2, it rounds the .39 to 4.

F8.4  ********          To print 4 characters after the decimal 
point,
                        the computer would have to print 
-586.3900.
                        Since that requires more than 8 
characters,
                        the computer complains by printing 
asterisks.
  G format To print a real number, the safest format is G14.6, 
because G14.6 can handle any real number well, even if the number 
is very large or very tiny.
  G14.6 prints 14 characters altogether, 6 of which are 
significant digits. Here are examples of numbers printed in G14.6 
format:
-0.283941E-29
0.293027
5.34523
39.4539
47802.3
986327.
0.288341E+24
  Example:
      PRUNES=17
      PRINT 10, PRUNES
10    FORMAT (1X,G14.6)
      END
Since PRUNES doesn't begin with I, J, K, L, M, or N, it stands 
for a real number. When the computer encounters the first line of 
the program, it will set PRUNES equal to the real number 17.0. It 
will print:
   17.0000
The program will run faster if you change the top line to this:
      PRUNES=17.0
  E format For real numbers, the usual formats are F and G, but 
another option is E.
  If you say E14.6 instead of G14.6, the computer will print an E 
in the answer. Here are examples:
Using G14.6 formatUsing E14.6 format
-0.283941E-29-0.283941E-29
0.2930270.293027E+00
5.345230.534523E+01
39.45390.394539E+02
47802.30.478023E+05
986327.0.986327E+06
0.288341E+240.288341E+24
  The G14.6 format is easier for a human to read than E14.6. But 
most programmers are stupid, don't know about G14.6, and use 
E14.6 instead.
                                                     P format 
FORTRAN's notation differs from BASIC.
                                                     If you ask 
the computer to print 288341000000000000000000.0 in FORTRAN by 
using G14.6 (or E14.6), the computer will normally print a 0 
before the decimal point, like this: 0.288341E+24. In BASIC, the 
computer will print a non-zero digit before the decimal point, 
like this: 2.88341E+23.
                                                     If you're 
writing a program in FORTRAN, but you prefer BASIC's notation, 
ask for 1PG14.6 (or 1PE14.6). The 1P makes the computer imitate 
BASIC. But if a FORMAT contains 1PG, it must not contain F 
afterwards; this will print a wrong answer:
      FORMAT (1X,1PG14.6,F8.2)
                        
                   Here is P.   The F afterwards
                                   prints a wrong answer!

                                                          Operations
                                                     For 
addition, subtraction, multiplication, and division, FORTRAN uses 
the same symbols as BASIC.
      N=2*(3+1)
      S=7.3+2.1
      PRINT 10, N,S
10    FORMAT (1X,I14,G14.6)
      END
Since N is 8, and S is 9.4, the computer will print:
             8   9.40000
                                                     Exponents 
For exponents, FORTRAN uses a double star:
      J=7**2
      P=.5**3
      PRINT 10, J,P
10    FORMAT (1X,I14,G14.6)
      END
Since J is 72 (which is 49), and P is .53 (which is .125), the 
computer will print:
            49   0.125000
                                                     For negative 
exponents, you need parentheses. You must say 6.1**(-2), not 
6.1**-2.
                                                     What type of 
answer? When you combine integers, the answer's an integer:
2+3 is 5
8-8 is 0
2*4 is 8
399/100  is 3 (not 3.99)
11/4     is 2 (not 2.75)
3/4      is 0 (not 0.75)
10**(-2) is 0 (not 0.01)
                                                     When you 
combine real numbers, the answer is real:
4.1+2.9      is 7.0 (not 7)
8.0-8.0      is 0.0 (not 0)
399.0/100.0  is 3.99
11.0/4.0     is 2.75
3.0/4.0      is .75
10.0**(-2.0) is .01

  When you combine an integer with a real number, the answer is 
real:
3+2.0      is 5.0
399/100.0  is 3.99
11/4.0     is 2.75
3/4.0      is .75
10.0**(-2) is .01
  Compare these:
7/10*10    is 0(because 7/10 is 0)
7/10*10.0  is 0.0(because 0*10.0 is 0.0)
7/10.0*10  is 7.0(because 7/10.0 is .7)
  Example:
      JERK=20.0+30.9
      PRINT 10, JERK
10    FORMAT (1X,I14)
      END
Since JERK begins with J, it stands for an integer. Since 
20.9+30.9 is 51.8, JERK stands for the integer 51. The computer 
will print:
            51
  Another example:
      APPLE=37/10
      PRINT 10, APPLE
10    FORMAT (1X,G14.6)
      END
Since APPLE begins with A, it stands for a real number. Since 
37/10 is 3, APPLE stands for the real number 3.0. The computer 
will print:
   3.00000
  Crimes that slow down the computer cop If you commit one of 
these crimes, the computer will work slowly. . . . 
little crime: use a real number
medium crime: mix reals with integers
big crime: use a real exponent
  For example, the computer handles 2.0+2.0 slower than 2+2, 
because 2.0+2.0 is a little crime.
  The bigger the crime, the slower the computer works. For 
example, the computer handles 2.1+7 (which is a medium crime) 
slower than 2.1+7.0 (which is just a little crime). Likewise, X=0 
(a medium crime) gets handled slower than X=0.0 (a little crime).
  5.1**2.0 is a big crime, since its exponent (2.0) is real. The 
computer handles it slower than 5.1**2, which is just a medium 
crime.
  5**3.1 is a gigantic crime, since it's a medium crime and a big 
crime simultaneously. Because the crime's so gigantic, some 
computers refuse to handle it. Say 5.0**3.1 instead.
                                        Advice about variables
                             FORTRAN, like BASIC, distinguishes 
variables, constants, and expressions:
X                                is a variable
2.7                              is not a variable; it's a 
numeric constant
`LOVE'                           is not a variable; it's a string 
constant
X+Y                              is not a variable; it's an 
expression
                             In a PRINT statement, some computers 
allow only variables. . . . 
                             allowed: PRINT 10, X
not                          allowed: PRINT 10, 2.7instead, say 
X=2.7 and PRINT 10, X
not                          allowed: PRINT 10, `LOVE'instead, 
say PRINT 10 and 10 FORMAT (1X,`LOVE')
not                          allowed: PRINT 10, X+Yinstead, say 
Z=X+Y and PRINT 10, Z
Other computers are more generous and allow anything. Find out 
about yours.
                             To help other humans understand your 
program, use long variable names throughout your program. Say 
RADIUS, not R; say AREA, not A; say VOLUME, not V; say SUM, not 
S; say TOTAL, not T. Because FORTRAN's variables are restricted 
to six characters, you might have to omit the last few syllables 
(revolutions becomes REVOLU) or the last few vowels (RVLTNS).
                             If you want a variable to be real, 
but its English name begins with I, J, K, L, M, or N, begin its 
FORTRAN name with an A (mass becomes AMAS; length becomes ALENGT 
or ALNGTH). If you want a variable to be an integer, but its 
English name doesn't begin with I, J, K, L, M, or N, begin its 
FORTRAN name with an I (population becomes IPOPUL) or misspell it 
(count becomes KOUNT) or choose a synonym (instead of position, 
say location, which is LOCATN).

            PLEASANT I/O
  You learned how to make the computer PRINT by using a FORMAT. 
Now you'll learn about PRINT's opposite (READ) and how to omit 
FORMATs altogether.

                READ
  The computer can READ.
      PRINT 10
10    FORMAT (1X,'TYPE SOME DIGITS')
      READ 20, N
20    FORMAT (I4)
      PRINT 30, N
30    FORMAT (1X,I4)
      END
  When you run the program, here's what happens. . . . 
  The top two lines make the computer print:
TYPE SOME DIGITS
  The word READ makes the computer wait for you to type 
something; it's like the BASIC word INPUT. The computer will wait 
for you to type the value of N, but line 20's FORMAT makes the 
computer read just the first 4 characters. For example, if you 
type ___ 
-75198622
the computer will read just the first 4 characters, which are 
-751; it will ignore the 98622; so N will be -751. Line 30's 
FORMAT makes the computer print:
-751
Altogether, the run looks like this:
The computer says:TYPE SOME DIGITS
You say:    -75198622
The computer replies:-751
  Hassles Line 30's FORMAT contains a carriage control 1X, but 
line 20's FORMAT omits the carriage control. Put a carriage 
control in formats that PRINT, but not in formats that READ.
  On PDP computers, say ACCEPT instead of READ.
  Blank spaces If you input a blank space, the computer treats it 
as a zero.
  For example, suppose you input:
-3 28219
Because of the I4 format, the computer will read just the first 4 
characters, which are -3 2; the blank space between the 3 and the 
2 is treated as a zero, so N will be -302.
  Suppose you input:
57
Because of the I4 format, the computer will read the 5, the 7, 
and two blanks. Since the blanks are treated as zeros, N will be 
5700.
  Suppose you input:
9527
Because of the I4 format, the computer will read the three 
beginning blanks and the 9. Since the blanks are treated as 
zeros, N will be 0009, which is 9. Line 30 makes the computer 
print:
   9

                                         Multiple 
variablesSuppose you write a program containing these lines:
      READ 20, L,M,N
20    FORMAT (I3,I4,2X,I2)
When you run that program, suppose you input:
58194138972824
The I3 format makes the first 3 characters (581) be L. The I4 
format makes the next 4 characters (9413) be M. The 2X format 
makes the next 2 characters (89) be skipped over. The I2 format 
makes the next two characters (72) be N. The remaining characters 
(824) are ignored. So the line is split like this. . . . 
Line you input:                                          
58194138972824
Fields in the FORMAT statement:                              I4 
2XI2
Variables in the READ statement:                          L        
                                                               
 
                                                         I3    
 
                                                            M  
N
                                         Suppose you write a 
program containing these lines:
      READ 20, J,K,L,M,N
20    FORMAT (2I3)
The format says to read two 3-character integers on each line. 
Suppose you input:
78345692
85431684
46185327
J will be 783, and K will be 456. L will be 854, and M will be 
316. N will be 461.
                                         Real variables Here's 
how to input a real number:
      PRINT 10
10    FORMAT (1X,'TYPE SOME DIGITS')
      READ 20, P
20    FORMAT (F6.2)
      PRINT 30, P
30    FORMAT (1X,G14.6)
      END
                                         The F6.2 format means: 
read 6 characters; if they don't contain the decimal point, 
insert it before the last 2 digits.
                                         For example, suppose you 
input:
327514968
The computer reads the first 6 characters (327514). Since they 
don't contain the decimal point, the computer inserts it before 
the last 2 digits, so P is 3275.14. Line 30 prints:
   3275.14
                                         Suppose you input:
7.5423967
The computer reads the first 6 characters (7.5423). Since they 
already contain the decimal point, P is 7.5423. Line 30 says to 
print that number by using 6 significant digits, so the computer 
prints:
   7.54230
                                         Suppose you input:
497E3
The computer reads 6 characters (497E3, followed by a blank). 
Since blanks are treated as zeros, the computer gets 497E30. 
Since 497E30 doesn't contain the decimal point, the computer 
inserts it before the last 2 digits, so P is 4.97E30. Line 30 
prints:
  0.497000E+31

          Omitting formats
  Most computers let you omit numeric formats. This program works 
on most modern computers (such as computers having FORTRAN 77, 
PDP-20 computers, PDP-10 computers using FORTRAN 10, PDP-11 
computers using FORTRAN IV-PLUS, CDC computers using FORTRAN 
IV-EXTENDED, and IBM computers using FORTRAN H-EXTENDED):
      PRINT 10          On PDP computers,
10    FORMAT (1X,'TYPE TWO INTEGERS')say TYPE instead of
      READ *, M,N       PRINT, and ACCEPT
      ISUM=M+N          instead of READ.
      PRINT *, ISUM
      END
  The word READ is followed by an asterisk, instead of a FORMAT 
number. The last PRINT is followed by an asterisk also. The 
asterisk makes the computer invent its own FORMAT. To make the 
program add 241 and 82976, input the numbers, separated by a 
comma:
241,82976
The computer will notice the comma's location and automatically 
use an I3 format for 241, a 1X format to skip over the comma, and 
an I5 format for 82976. To print ISUM, the computer will use a 
safe format, such as I14 or I15.
  By omitting formats, you gain two advantages:
  1. You can write FORTRAN programs more quickly.
  2. The person who inputs doesn't have to worry about whether 
his spacing matches the format. The computer invents a format 
that matches his input.
  Different versions On CDC computers using TS FORTRAN and on 
Honeywell computers, omit the asterisk after READ and PRINT:
      PRINT 10
10    FORMAT (1X,'TYPE THE NUMBERS')
      READ, M,N
      ISUM=M+N
      PRINT, ISUM
      END
  On PDP-10 computers using F40 FORTRAN, and on PDP-11 computers 
using regular FORTRAN IV, you need FORMATs, but omit the number 
in the I format:
      TYPE 10
10    FORMAT (1X,'TYPE THE NUMBERS')
      ACCEPT 20, M,N
20    FORMAT (1X,2I)
      ISUM=M+N
      TYPE 30, ISUM
30    FORMAT (1X,I)
      END
  Real numbers You can use similar short cuts for real numbers.


                      LOGIC
  You learned how to say GO TO and STOP. Taking those concepts 
further, let's see how to say IF and DO and give a computed GO 
TO.

                       IF
  FORTRAN uses these clauses:
Clause    Meaning
IF (I .LT. 5)If I is Less Than 5
IF (I .GT. 5)If I is Greater Than 5
IF (I .LE. 5)If I is Less than or Equal to 5
IF (I .GE. 5)If I is Greater than or Equal to 5
IF (I .EQ. 5)If I is EQual to 5
IF (I .NE. 5)If I is Not Equal to 5
  Notice that each relational operator (such as LT) must be 
enclosed in periods, and each condition (such as I .LT. 5) must 
be enclosed in parentheses.
  By using those clauses, you can build statements:
Statement       Meaning
IF (I .LT. 5) J=3If I is Less Than 5, let J=3
IF (I .LT. 5) GO TO 80If I is Less Than 5, go to line 80.
IF (I .LT. 5) STOPIf I is Less Than 5, stop.
IF (I .LT. 5) PRINT 10, JIf I is Less Than 5, print J using line 
10's FORMAT.
  You can use the words AND and OR:
Idea            How to say it in FORTRAN
If I is 2 or 9 or 13IF (I .EQ. 2 .OR. I .EQ. 9 .OR. I .EQ. 13)
If I is an integer from 1 to 8IF (I .GE. 1 .AND. I .LE. 8)
If X<Y<Z        IF (X .LT. Y .AND. Y .LT. Z)
If A is less than both B and CIF (A .LT. B .AND. A .LT. C)
If X negative or between 5 & 9IF (X .LT. 0.0 .OR. X .GE. 5.0. 
.AND. X .LE. 9.0)
  Take this test: cover the column that says ``How to say it in 
FORTRAN''. Try to translate each ``Idea'' into FORTRAN, then 
check your answers. If one of your answers is shorter than the 
correct answer, take the test again! For example, the following 
answer to the first idea is wrong:
IF (I .EQ. 2 .OR. 9 .OR. 13)
  END IF FORTRAN 77 lets you say ``END IF''.
  For example, here's how FORTRAN 77 lets you say, ``If I is 
greater than 5, let J be 80 and let K be 90'':
      IF (I .GT. 5) THEN
         J=80
         K=90
      END IF
  Here's how FORTRAN 77 lets you say, ``If I is greater than 5, 
let J be 80 and let K be 90; but if I is not greater than 5, let 
J be 30 and let K be 50'':
      IF (I .GT. 5) THEN
         J=80
         K=90
      ELSE
         J=30
         K=50
      END IF
  Here's how FORTRAN 77 lets you say, ``If I is greater than 5, 
let J be 80 and let K be 90; if I is not greater than 5, but I is 
greater than 2, let J be 81 and let K be 92; if I is not greater 
than 2, let J be 30 and let K be 50'':
      IF (I .GT. 5) THEN
         J=80
         K=90
      ELSE IF (I .GT. 2) THEN
         J=81
         K=92
      ELSE
         J=30
         K=50
      END IF
  Warning: to say ``END IF'', you must get FORTRAN 77. If you use 
FORTRAN IV instead, ``END IF'' doesn't work. I recommend that you 
get FORTRAN 77.
                                                     Three-way IF 
Here's a different kind of IF statement:
      IF (X) 20,50,90
It means:
If X is a negative number, go to line 20.
If X is zero, go to line 50.
If X is a positive number, go to line 90.
                                                     That kind of 
IF statement is called a three-way IF, or an arithmetic IF. (To 
pronounce ``arithmetic'', put the accent on met.) The other kind 
of IF is called a logical IF.
           Computed GO TO
  In your program, you can say:
      GO TO (80,100,20,350), I
That means: go to either 80, 100, 20, or 350, depending on what I 
is. More specifically, it means:
Go to line  80, if I is 1.
Go to line 100, if I is 2.
Go to line  20, if I is 3.
Go to line 350, if I is 4.
Proceed to the line underneath, if I is a different integer.
  That FORTRAN statement is called a computed GO TO. It resembles 
this BASIC statement:
30 ON I GO TO 80,100,20,350

                 DO
  This program prints the square of every number from 80 to 100, 
and then prints GET LOST:
BASIC         FORTRAN
10 FOR I = 80 TO 100      DO 30 I=80,100
20     PRINT I^2         J=I**2
                       PRINT 20, J
              20       FORMAT (1X,I14)
30 NEXT I     30    CONTINUE
40 PRINT "GET LOST"      PRINT 40
              40    FORMAT (1X,'GET LOST')
                    END
  If you compare the BASIC with the FORTRAN, you'll notice 
FORTRAN uses the word DO instead of FOR, uses a comma instead of 
TO, and uses CONTINUE instead of NEXT. The statement DO 30 I=5,9 
means: DO every line up through line 30, repeatedly, as I goes 
from 5 to 9. In BASIC, programmers indent every line between FOR 
and NEXT; in FORTRAN, programmers indent every line between DO 
and CONTINUE. In BASIC, the indented lines are called a 
FOR...NEXT loop; in FORTRAN, they're called a DO loop.
  If you want the computer to print the square of every fifth 
number from 80 to 100, change the program's top line:
BASIC             FORTRAN
10 FOR I = 80 TO 100 STEP 5DO 30 I=80,100,5

                                         Restrictions In a DO 
statement, some computers allow only positive integer variables 
and constants:
Not allowed                                        Why         
Say this instead
DO 10 X=1.0,5.0                                    reals are not 
allowed                                                        DO 
10 I=1,5

DO 10 X=17.3,98.5                                  reals are not 
allowed                                                        DO 
10 I=173,985
                                                                  
X=I/10.0

DO 10 I=0,5                                        0 is not 
positive                                                       DO 
10 J=1,6
                                                                  
I=J-1

DO 10 I=-3,5                                       -3 is not 
positive                                                       DO 
10 J=1,9
                                                                  
I=J-4

DO 10 I=100,7,-1                                   -1 is not 
positive                                                       DO 
10 J=7,100
                                                                  
I=107-J

DO 10 I=5,J+K                                      + is not 
allowed                                                        
L=J+K
                                                               DO 
10 I=5,L
                                         Other computers are more 
generous and allow anything. Find out about yours.
                                         In the middle of a DO 
loop, don't change the value of the index. For example, if your 
DO loop begins with ___ 
      DO 10 I=1,100
don't insert this line in the middle of your loop:
         I=14
It will confuse the computer.
                                         Zero-trip DO loops If 
you say ___ 
      DO 10 I=1,N
the computer will do up through line 10, N times. For example, if 
N is 73, the computer will do up through line 10, 73 times. If N 
is 2, the computer will do up through line 10, twice. If N is 1, 
the computer will do up through line 10, once.
                                         What happens if N is 
less than 1? The answer depends on which version of FORTRAN 
you're using.
                                         If you're using FORTRAN 
77, the computer will skip the loop, and proceed to the line 
below line 10. But if you're using FORTRAN IV, the computer will 
do the loop once, as if N were 1.
                                         FORTRAN 77 makes more 
sense; but alas, many computers still use FORTRAN IV.
                                         A DO loop that FORTRAN 
77 skips (because N is less than 1) is called a zero-trip DO 
loop, because the computer takes ``zero trips through the loop'' 
(instead of 1 trip or 2 trips or many trips).
                                         Find out whether your 
computer's version of FORTRAN resembles FORTRAN 77 and permits 
zero-trip DO loops.

                      LISTS
  To handle lists, use these tricks. . . . 

                   Subscripts
  Like BASIC, FORTRAN permits subscripts:
      DIMENSION X(4)
      X(1)=.21
      X(2)=.3
      X(3)=1.08
      X(4)=5.0
      SUM=X(1)+X(2)+X(3)+X(4)
      PRINT 10, X,SUM
10    FORMAT (1X,G14.6)
      END
  The top line says X will be a list of 4 numbers, called X(1), 
X(2), X(3), and X(4). Since X doesn't begin with I, J, K, L, M, 
or N, the 4 numbers will be real.
  The PRINT statement makes the computer print the list and the 
SUM, like this:
  0.210000
  0.300000
   1.08000
   5.00000
   6.59000
  If you change the format to (1X,5G14.6), the computer will 
print all 5 numbers on the same line:
  0.210000      0.300000       1.08000       5.00000       
6.59000
  You must say DIMENSION if your program uses subscripts, even if 
the subscripts are small. Say DIMENSION at the very top of the 
program. Make sure you say DIMENSION, not DIM or DIMENSIONS. The 
computer assumes all subscripts will be positive, so don't say 
X(0). If a subscript is zero or negative or larger than the 
DIMENSION statement says, the computer might not notice your 
error, and will print wrong answers without warning you.
  If your program begins like this ___ 
      DIMENSION A(6)
      READ 10, A
the computer will begin by reading 6 real numbers, which will 
become A(1), A(2), A(3), A(4), A(5), and A(6).
  Double subscripts If you want T to be a table of numbers, and 
you want T to have 4 rows and 2 columns, begin your program by 
saying:
      DIMENSION T(4,2)
To print T, say:
      PRINT 10, T(1,1), T(1,2)
      PRINT 10, T(2,1), T(2,2)
      PRINT 10, T(3,1), T(3,2)
      PRINT 10, T(4,1), T(4,2)
10    FORMAT (1X,2G14.6)
If you say ___ 
      PRINT 10, T
the computer will print the entire table T, but in an undesirable 
order: it will print T(1,1), T(2,1), T(3,1), and T(4,1), then 
T(1,2), T(2,2), T(3,2), and T(4,2). Similarly, ``READ 5, T'' 
makes the computer read T in an undesirable order.

                   Implied DO
  This statement ___ 
      PRINT 10, X(3),X(4),X(5),X(6),X(7)
can be written more briefly, like this:
      PRINT 10, (X(I), I=3,7)
It means: using line 10's format, print the value of X(I), for I 
= 3 to 7. The construction (X(I), I=3,7) is called an implied DO 
loop. Notice the parenthesis at the beginning, the parenthesis at 
the end, and the commas.
  Here are other examples of implied DO loops:
Implied DO loopMeaning
(X(I), I=100,120,5)X(100),X(105),X(110),X(115),X(120)
(X(I),Y(I), I=3,7)X(3),Y(3), X(4),Y(4), X(5),Y(5), X(6),Y(6), 
X(7),Y(7)
  Calendar Here's a calendar:
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
  This program prints it:
      PRINT 10, (I, I=1,31)
10    FORMAT (1X,I2,1X,I2,1X,I2,1X,I2,1X,I2,1X,I2,1X,I2)
      END
  The program's top statement says to print every value of I, for 
I = 1 to 31. The FORMAT says to print 7 integers on each line, 
and separate the integers by spaces.
  Since 1X followed by I2 is about the same as I3, you can write 
the FORMAT more briefly:
10    FORMAT (I3,I3,I3,I3,I3,I3,I3)
You can be even briefer:
10    FORMAT (7I3)
  Tables If T is a table having 3 rows and 5 columns, these lines 
will print it in the correct order:
      PRINT 20, T(1,1), T(1,2), T(1,3), T(1,4), T(1,5)
      PRINT 20, T(2,1), T(2,2), T(2,3), T(2,4), T(2,5)
      PRINT 20, T(3,1), T(3,2), T(3,3), T(3,4), T(3,5)
20    FORMAT (1X,5G14.6)
This short cut does the same thing:
      PRINT 20, (T(1,J), J=1,5)
      PRINT 20, (T(2,J), J=1,5)
      PRINT 20, (T(3,J), J=1,5)
20    FORMAT (1X,5G14.6)
Here's a shorter cut:
      PRINT 20, ((T(I,J), J=1,5), I=1,3)
20    FORMAT (1X,5G14.6)
To read the table, say:
      READ 10, ((T(I,J), J=1,5), I=1,3)


                      DATA
  This program shows FORTRAN's DATA statement, which differs from 
BASIC's:
Program               Meaning
      DATA X/8.7/, Y/1.4/, Z/9.0/X is 8.7, Y is 1.4, and Z is 
9.0.
      X=100.6         X changes to 100.6
      PRINT 10, X,Y,Z The computer will print:
10    FORMAT (1X,3G14.6)   100.600       1.40000       9.00000
      END
  In that DATA statement, you must write 9.0, not 9: the number 
must be real, since Z is real.
  The DATA statement resembles these three statements ___ 
      X=8.7
      Y=1.4
      Z=9.0
but is faster.
  Here's another way to type the DATA statement:
      DATA X,Y,Z/8.7,1.4,9.0/
It says X, Y, and Z are 8.7, 1.4, and 9.0 respectively.
  Like the DIMENSION statement, the DATA statement belongs at the 
very top of the program. If you want both a DIMENSION statement 
and a DATA statement, put the DIMENSION statement first.
  This DATA statement says A, B, C, D, and E are all 1.7, and X, 
Y, and Z are all 9.6:
      DATA A,B,C,D,E,X,Y,Z/1.7,1.7,1.7,1.7,1.7,9.6,9.6,9.6/
Since the first 5 numbers are 1.7, and the next 3 numbers are 
9.6, you can write more briefly:
      DATA A,B,C,D,E,X,Y,Z/5*1.7,3*9.6/
  Subscripted DATA To make A be this list ___ 
81.7
92.6
25.3
49.8
72.1
68.8
begin your program with these lines:
      DIMENSION A(6)
      DATA A/81.7,92.6,25.3,49.8,72.1,68.8/
  To make T be this table ___ 
8.4 9.7
5.1 6.8
2.5 7.2
6.3 9.8
begin your program with these lines:
      DIMENSION T(4,2)
      DATA T/8.4,5.1,2.5,6.3,9.7,6.8,7.2,9.8/
Notice you must list the entire first column, then the second.

          String variables
  This program works on most computers:
      N='UP'
      PRINT 10, N
10    FORMAT (1X,A2)
      END
The top line says N is the string `UP'. The next line says to 
print N, using the format in line 10. The A2 format means a 
2-character string. (The A is derived from the word Alphabet.) 
The computer will print:
UP
  Different versions Some computers allow apostrophes only in 
FORMAT, DATA, and CALL statements. (You'll learn about CALL 
statements later.) On such computers, the statement N=`UP' is 
illegal. Instead say:
      DATA N/'UP'/
  Restrictions A string statement should look like an integer: it 
should begin with the letter I, J, K, L, M, or N. You can say 
N=`UP' but shouldn't say X=`UP'.
  The string a variable stands for must be short. You  can  say 
N=`UP' but not N= `SUPERCALIFRAGILISTICEXPIALIDOCIOUS'. The 
longest permissible string depends on your computer:
Computer            Longest string allowed
PDP-11 (using FORTRAN IV) 2 characters
PDP-11 (using FORTRAN IV-PLUS), IBM 4 characters
PDP-10, PDP-20, Honeywell 5 characters
CDC                   10 characters
  Fancy examples Examine this program:
      PRINT 10
10    FORMAT (1X,'DO YOU LIKE ME?')
      READ 20, IREPLY
20    FORMAT (A1)
      IF (IREPLY .EQ. 'Y') PRINT 30
30    FORMAT (1X,'I LIKE YOU TOO!')
      PRINT 40
40    FORMAT (1X,'SO LONG, BUSTER.')
      END
  The first pair of lines make the computer print DO YOU LIKE ME? 
The next pair set IREPLY equal to the first letter the human 
types. If the human types YESIREE, the computer will set IREPLY 
equal to `Y' and will therefore print:
I LIKE YOU TOO!
SO LONG, BUSTER.
But if the human types NOT AT ALL, the computer will set IREPLY 
equal to `N' and will therefore print just:
SO LONG, BUSTER.
In that program, the string is called IREPLY instead of REPLY, to 
make it an integer.
                                         Advanced example:
      DIMENSION NAME(25)
      PRINT 10
10    FORMAT (1X,'WHAT IS YOUR NAME?')
      READ 20, NAME
20    FORMAT (25A2)
      PRINT 30, NAME
30    FORMAT (1X,'I HATE ANYONE NAMED ',25A2)
      END
The top line says NAME will be a list of 25 elements. The next 
pair of lines print WHAT IS YOUR NAME? If the human answers ___ 
BARTHOLOMEW HIERONYMOUS MCGILLICUDDY, M.D.
the format in line 20 sets NAME equal to 25 two-character 
strings:
NAME(1) is `BA'                                  NAME(10) is 
`YM'NAME(19) is `, '
NAME(2) is `RT'                                  NAME(11) is 
`OU'NAME(20) is `M.'
NAME(3) is `HO'                                  NAME(12) is `S 
'NAME(21) is `D.'
NAME(4) is `LO'                                  NAME(13) is 
`MC'NAME(22) is `  '
NAME(5) is `ME'                                  NAME(14) is 
`GI'NAME(23) is `  '
NAME(6) is `W '                                  NAME(15) is 
`LL'NAME(24) is `  '
NAME(7) is `HI'                                  NAME(16) is 
`IC'NAME(25) is `  '
NAME(8) is `ER'                                  NAME(17) is `UD'
NAME(9) is `ON'                                  NAME(18) is `DY'
Format 30 prints:
I HATE ANYONE NAMED BARTHOLOMEW HIERONYMOUS MCGILLICUDDY, M.D.
                                         To make that program run 
faster, use fewer strings. For example, if you have a CDC 
computer, each string can be as long as 10 characters, so you 
need only 5 strings to make 50 characters:
      DIMENSION NAME(5)
      PRINT 10
10    FORMAT (1X,'WHAT IS YOUR NAME?')
      READ 20, NAME
20    FORMAT (5A10)
      PRINT 30, NAME
30    FORMAT (1X,'I HATE ANYONE NAMED ',5A10)
      END
                                         FORTRAN 77 strings On 
computer having FORTRAN 77, and on IBM computers using WATFIV, 
you can request super-long strings:
      CHARACTER*50 NAME
      PRINT 10
10    FORMAT (1X,'WHAT IS YOUR NAME?')
      READ 20, NAME
20    FORMAT (A50)
      PRINT 30, NAME
30    FORMAT (1X,'I HATE ANYONE NAMED ',A50)
      END
                                         The top line requests 
that NAME be a 50-character string. Like the DIMENSION statement, 
the CHARACTER statement must be put at the very top of the 
program, above even the DATA statements.

              FUNCTIONS
  To do advanced math, use FORTRAN's functions.

             Square root
  This program finds the square root of 9:
      A=SQRT(9.0)
      PRINT 10, A
10    FORMAT (1X,G14.6)
      END
The computer will print:
   3.00000
  In that program, you must say SQRT(9.0), not SQRT(9). If you 
say SQRT(9), the computer will either gripe or print a wrong 
answer.
  The number in parentheses must be real. That's why you can say 
SQRT(9.0) but not SQRT(9). You can say SQRT(8.0+1.0) but not 
SQRT(8+1). You can say SQRT(X) but not SQRT(J).
  Be careful when you translate from BASIC to FORTRAN: in BASIC, 
you say SQR; in FORTRAN, you say SQRT instead.
  This program prints a table, showing the square root of 2.0, 
the square root of 3.0, the square root of 4.0, the square root 
of 5.0, etc.:
      X=2.0
10    Y=SQRT(X)
      PRINT 20, X,Y
20    FORMAT (1X,2G14.6)
      X=X+1.0
      GO TO 10
      END
The computer will print:
   2.00000       1.41421
   3.00000       1.73205
   4.00000       2.00000
   5.00000       2.23607
   6.00000       2.44949
   7.00000       2.64575
   8.00000       2.82843
   9.00000       3.00000
   10.0000       3.16228
   etc.

                FLOAT
  If you say FLOAT, the computer will create a FLOATing-point 
number (in other words, a real number), by using an integer. For 
example, FLOAT(3) is 3.0. If J is 7, then FLOAT(J) is 7.0.
  The word FLOAT can help you solve the following problems. . . . 
  Find the square root of an integer J Unfortunately, you aren't 
allowed to say SQRT(J), because what you take the square root of 
must be a real number. You can say SQRT(X) but not SQRT(J). 
Solution: say X=J, and then say SQRT(X). Shorter solution: say 
SQRT(FLOAT(J)).
  Divide J by K accurately Unfortunately, saying J/K gives an 
inaccurate answer, because when the computer divides integers it 
gives an integer answer, instead of an accurate real answer. 
Solution: say X=J, then Y=K, then X/Y. Shorter solution: say 
FLOAT(J)/FLOAT(K).
                                                  Random numbers
                                         Here's how to set R 
equal to a random decimal between 0 and 1:
Computer                                         What to say
CDC                                              R=RANF(0)
PDP-10, PDP-11                                   R=RAN(0)
PDP-11                                           
R=RAN(ISEED,ISEED2)
                                         To randomize the random 
numbers on PDP-10 and PDP-20 computers, put these lines near the 
top of your program:
      CALL TIME(ISEED,ISEED2)
      CALL SETRAN(MOD(ISEED/2+ISEED2/2, 2147483648))
On other computers, randomizing is even more complicated; ask the 
people who run your computer center.

                                                 Maxima and minima
                                         To find the maximum real 
number in a list, ask for AMAX1.
                                         For example, AMAX1(4.7, 
2.8, 41.6, 9.2, 82.3, 9.7) is 82.3. And AMIN1(4.7, 2.8, 41.6, 
9.2, 82.3, 9.7) is the minimum, which is 2.8.
                                         If the numbers in the 
list are integers, say MAX0 instead of AMAX1, and say MIN0 
instead of AMIN1. When you type ``MAX0'' and ``MIN0'', make sure 
you end with a zero, not the letter ``oh''.

                                                  Absolute value
                                         ABS(X) means the 
ABSolute value of X; in other words, X without its minus sign. 
For example:
ABS(-5.2) is 5.2
ABS(-7.0) is 7.0
ABS(9.3)  is 9.3
                                         For integers, say IABS 
instead of ABS. For example, IABS(-7) is 7.

                                                     Remainder
                                         When you divide 11 by 4, 
the remainder is 3:
     2
4 ) 11
    -8
     3 is the remainder
                                         If you ask for MOD(11,4) 
the computer will divide 11 by 4 and get the remainder, which is 
3; so MOD(11,4) is 3.
                                         Use MOD for integers; 
use AMOD for reals. For example, AMOD(11.0, 4.0) is 3.0.
                  Trigonometry
  If your computer has FORTRAN 77, or your computer is an IBM 
having FORTRAN H-EXTENDED, or your computer is a PDP-11 having 
FORTRAN IV-PLUS, you can use these trigonometric functions:
SymbolMeaning
SIN(X)the SINe of X radians
COS(X)the COSine of X radians
TAN(X)the TANgent of X radians

ASIN(X)the ArcSINe of X in radians; the number whose sine is X
ACOS(X)the ArcCOSine of X in radians; the number whose cosine is 
X
ATAN(X)the ArcTANgent of X in radians; the number whose tangent 
is X

SINH(X)the SINe Hyperbolic of X
COSH(X)the COSine Hyperbolic of X
TANH(X)the TANgent Hyperbolic of X
  If your computer is old-fashioned, it restricts you:
Old-fashioned systemRestriction
PDP-10, PDP-20  you can't say TAN(X)
CDC             you can't say SINH(X) or COSH(X)
other IBM computerssay ARSIN(X), not ASIN(X); say ARCOS(X), not 
ACOS(X)
FORTRAN IV computersyou can't say TAN(X), ASIN(X), ACOS(X), 
SINH(X), COSH(X)
  You can replace X by any real number. For example, you can say 
SIN(4.0) but not SIN(4); you can say SIN(Y) but not SIN(J).
  Be careful when you translate from BASIC to FORTRAN: in BASIC, 
you say ATN; in FORTRAN, you say ATAN instead.
  You've seen that SIN(X) is the sine of X radians. But what's 
the sine of X degrees? On PDP-10 and PDP-20 computers, you can 
find the sine of X degrees by asking for SIND(X); and you can 
find the cosine of X degrees by asking for COSD(X).
  ATAN2(Y,X) is about the same as ATAN(Y/X), but is faster, more 
accurate, and gives a useful answer even when X is zero or 
negative. ATAN2(Y,X) is the angle (in radians) of the line that 
goes through the origin and the point (X,Y).

                    Calculus
  You can use these functions:
FunctionMeaning

EXP(X)  eX

ALOG(X) loge X

ALOG10(X)log10 X
  You can replace X by any real number, but not by an integer. 
Each of those functions produces a real answer, since none of 
them begins with I, J, K, L, M, or N.
  The logarithm function is called ALOG instead of LOG, to avoid 
beginning with L. Be careful when you translate from BASIC to 
FORTRAN: in BASIC, you say LOG; in FORTRAN, you say ALOG instead.


                 EXOTIC FEATURES
  Let's take off our handcuffs and go wild!
  Let's go beyond integers and reals, to other kinds of numbers 
that are wilder: double precision and complex.
  Let's go beyond standard functions and invent our own 
functions. Let's go beyond standard statements and invent our own 
statements, by using subroutines and comments. Let's go beyond 
the DATA statement and invent data files.
  Here we go. . . . 

                    Comments
  If you type C instead of a line number, the computer will 
ignore the line.
      N=50+13
C  I HATE COMPUTERS!
      PRINT 10, N
10    FORMAT (1X,I14)
      END
The computer will ignore the Comment. The computer will print 63.
  The C in FORTRAN is like the REMARK in BASIC: use it to 
document your program. 

                DOUBLE PRECISION
  Some computers are more accurate than others:
Computer      Accuracy for real numbers
PDP-11, IBM    7 digits
PDP-10, PDP-20, Honeywell 8 digits
CDC           14 digits
  For example, suppose you feed this program to a PDP-11 or IBM:
      A=5398.1642376236
      PRINT 10, A
10    FORMAT (1X,F15.10)
      END
Expect the first 7 digits the computer prints to be correct 
(5398.164), but the remaining digits it prints to be wrong: they 
arise from round-off error inside the computer.
  A PDP-11 or IBM prints some numbers to an accuracy of 8 digits 
and others to an accuracy of just 6 digits, but 7 digits is 
typical.
  For real numbers, I recommend you use a G14.6 format, because 
it's safe: it prints just the first 6 digits. If you want to see 
further digits that are probably correct, use these formats 
instead:
Computer      FormatWhat the format does
PDP-11, IBM   G15.7 prints the first  7 digits
PDP-10, PDP-20, HoneywellG16.8prints the first  8 digits
CDC           G22.14prints the first 14 digits
  You can obtain extra accuracy, by requesting double precision:
Computer          Accuracy for double precisionFormat
PDP-11            14 digits             D22.14
PDP-10 (using KA), Honeywell16 digits   D24.16
IBM               17 digits             D25.17
PDP-10 (using KI or KL), PDP-2018 digitsD26.18
CDC               29 digits             D37.29
  Each of these programs computes the square root of 6.3x108 on a 
PDP-11 computer:
Using reals     Using double precision
                      DOUBLE PRECISION A
      A=SQRT(6.3E8)      A=DSQRT(6.3D8)
      PRINT 10, A      PRINT 10, A
10    FORMAT (1X,G15.7)10    FORMAT (1X,D22.14)
      END             END
The program on the left computes 7 digits. The program on the 
right computes 14. Comparing the programs, you'll notice four 
differences:
                                                     1. For 
double precision you must use double precision numbers. Instead 
of saying 6.3E8, say 6.3D8. The D means Double precision.
Real number                                                  
Double precision
6.3E8                                                        
6.3D8
29.6                                                         
29.6D0
                                                                  
                                                                  
this is a zero
                                                     2. For 
double precision, you must use double precision functions. 
Instead of saying SQRT, say DSQRT.
Real function                                                
Double precision
SQRT                                                         
DSQRT

AMAX1                                                        
DMAX1
AMIN1                                                        
DMIN1

ABS                                                          DABS
AMOD                                                         DMOD
EXP                                                          DEXP

ALOG                                                         DLOG
ALOG10                                                       
DLOG10

SIN                                                          DSIN
COS                                                          DCOS
TAN                                                          DTAN

ASIN                                                         
DASIN
ACOS                                                         
DACOS
ATAN                                                         
DATAN
ATAN2                                                        
DATAN2

SINH                                                         
DSINH
COSH                                                         
DCOSH
TANH                                                         
DTANH
                                                     3. For 
double precision, you must use double precision variables. 
Normally, the variable A would be real; to make it double 
precision instead, say:
      DOUBLE PRECISION A
Normally, the variables LENGTH and MASS would be integers, and 
SPEED would be real; to make them all double precision, say:
      DOUBLE PRECISION LENGTH,MASS,SPEED
Like the DIMENSION and CHARACTER statements, the DOUBLE PRECISION 
statement must be put at the very top of the program, above even 
the DATA statements. If you say ___ 
      IMPLICIT DOUBLE PRECISION(D)
every variable whose first letter is D will automatically be 
double precision; for example, DISTAN and DIAMET and DSIZE will 
automatically be double precision.
                                                     4. For 
double precision you must use double precision formats. Instead 
of a G format, use D22.14, or whichever D format is appropriate 
for your computer.
                                                     Expense 
Although double precision arithmetic is more precise than real 
arithmetic, it's also more expensive: it consumes more of the 
computer's time, and the numbers consume more of the computer's 
memory.
  Combinations If you combine an integer or a real number with a 
double precision number, the answer will be double precision.

               COMPLEX
  In mathematics, the square root of -1 is called i. So i2 is -1. 
The number i obeys most of the rules of algebra:
 i+i  is 2i
2i+3i is 5i
(8+2i) + (7+3i) is 15+5i
(8+2i) * (7+3i) is 8*7 + 8*3i + 2i*7 + 2i*3i,
          which is 56 + 24i + 14i + 6i2,
          which is 56 + 24i + 14i + -6,
          which is 50 + 38i
  The number i is neither positive nor negative nor zero; it's 
pictured instead as being above the real number line:
                i
-5 -4 -3 -2 -1  0  1  2  3  4  5
2i is further above the real number line: it's 2 units above 0. 
Another example: 5+2i is 2 units above 5.
  A number that involves i is called complex. So 5+2i is complex. 
Its real part is 5, its imaginary part is 2, and its conjugate is 
5-2i.
  This program multiplies 8+2i by 7+3i and prints the correct 
answer, 50+38i:
      COMPLEX B
      B=(8.0, 2.0) * (7.0, 3.0)
      PRINT 10, B
10    FORMAT (1X,2G14.6)
      END
  FORTRAN says (8.0, 2.0) instead of 8+2i. The decimal points and 
parentheses are required.
  To make B complex instead of real, say COMPLEX B. Like the 
DIMENSION and CHARACTER and DOUBLE PRECISION statements, the 
COMPLEX statement must be put at the very top of the program, 
above even the DATA statements.
  To print B, use the G14.6 format twice (once for the real part, 
and once for the imaginary part). The computer will print:
   50.0000       38.0000
  If you say IMPLICIT COMPLEX(C), every variable whose first 
letter is C will automatically be complex.
  Although you can write 8+2i as (8.0, 2.0), you cannot write 
X+Yi as (X, Y); instead write CMPLX(X, Y).
  Here's the rule: to build a complex number from variables 
instead of from constants, say CMPLX. The variables that the 
complex number is built from must be real.
  If B is complex, you can use these functions:
FunctionMeaning
CSQRT(B)the complex number that's the square root of B

CSIN(B) the complex number that's the sine of B
CCOS(B) the complex number that's the cosine of B

CEXP(B) the complex number that's eB
CLOG(B) the complex number that's log B

CABS(B) the real number that's the absolute value of B
REAL(B) the real number that's the real part of B
AIMAG(B)the real number that's the imaginary part of B

CONJG(B)the complex number that's the conjugate of B

                                         This program finds the 
square root of -9 and prints the correct answer, 3i:
      COMPLEX B,Z
      B=-9
      Z=CSQRT(B)
      PRINT 10, Z
10    FORMAT (1X,2G14.6)
      END
Since the top line says B is complex, the second line makes B the 
complex number -9+0i. The next line makes Z the square root of 
-9+0i, which is 0+3i. The computer will print the 0 and the 3:
   0.000000       3.00000
                                         Since that program sets 
B equal to -9+0i, which FORTRAN writes as (-9.0, 0.0), you can 
shorten the program to this:
      COMPLEX Z
      Z=CSQRT( (-9.0, 0.0) )
      PRINT 10, Z
10    FORMAT (1X,2G14.6)
      END
Make sure the number inside CSQRT's parentheses is complex: you 
need the decimal points, comma, and parentheses.
                                         When the computer 
combines a complex number with an integer, a real, or a double 
precision number, the result is complex.
                                         Some computers limit 
your use of complex numbers, by restrictions such as:
``Don't say a complex number equals a double precision number.''
``Don't combine a complex number with a double precision 
number.''
``Don't raise a number to a complex power.''
``Don't raise a complex number to a power, unless the power is an 
integer.''
Find out whether your computer has those restrictions.
             Subroutines
  This program is a combination of two routines:
      PRINT 10
10    FORMAT (1X,'KIDS')
      CALL YUMMY
      PRINT 20
20    FORMAT (1X,'LOLLIPOPS')
      END

      SUBROUTINE YUMMY
      PRINT 10
10    FORMAT (1X,'SUCK')
      RETURN
      END
  Each routine ends with the word END.
  The first routine is called the main routine.
  The second routine is called the subroutine, and begins with 
the word SUBROUTINE. I decided to name it YUMMY, so its top line 
says SUBROUTINE YUMMY.
  Above the word SUBROUTINE, I put a blank line. That blank line 
is optional; it helps humans find where the subroutine begins.
  In the main routine, the top pair of lines makes the computer 
print:
KIDS
The next line says CALL YUMMY, which makes the computer skip down 
to subroutine YUMMY. Subroutine YUMMY makes the computer print 
___ 
SUCK
and then RETURN to the main routine, which finishes by printing:
LOLLIPOPS
  Altogether, the program prints:
KIDS
SUCK
LOLLIPOPS
  Notice that line 10 in the main routine is different from line 
10 in the subroutine. Similarly, an X in the main routine is 
different from one in the subroutine:
      X=3.4
      CALL FUNNY
      PRINT 10,X
10    FORMAT (1X,G14.6)
      END

      SUBROUTINE FUNNY
      X=925.1
      Y=X+1.0
      PRINT 10, Y
10    FORMAT (1X,G14.6)
      RETURN
      END
The computer will set the main routine's X equal to 3.4. Then it 
will call FUNNY. The X in FUNNY is 925.1, so Y is 926.1, and the 
computer will print:
   926.100
When the computer returns to the main routine, it will print the 
main routine's X, which is still:
   3.40000

                                         Passing information 
between routines To pass information from one routine to another, 
put the information in parentheses:
      A=5.2
      CALL LEMON(A)
      PRINT 10, A
10    FORMAT (1X,G14.6)
      END

      SUBROUTINE LEMON(X)
      PRINT 100, X
100   FORMAT (1X,G14.6)
      X=7.1
      RETURN
      END
The computer sets A equal to 5.2. Then it calls LEMON. The A and 
X in parentheses mean: the main routine's A is the subroutine's 
X, so the subroutine's X is 5.2. Line 100 prints:
   5.20000
The next line changes X to 7.1. When the computer returns to the 
main routine, the main routine's A is the subroutine's X, so the 
main routine's A is 7.1. Line 10 prints:
   7.10000
                                         A harder example:
      P=2.1
      CALL JUNK(P)
      PRINT 10, P
10    FORMAT (1X,G14.6)
      END

      SUBROUTINE JUNK(P)
      P=3.0*P
      RETURN
      END
The computer sets P equal to 2.1 and then calls JUNK. The P in 
parentheses means: the main routine's P is the subroutine's P. 
The subroutine triples P, so P becomes 6.3. When the computer 
returns to the main routine, line 10 prints:
   6.30000
                                         Another example:
      Q=1.4
      CALL FAT(5.0, Q+.3, R)
      PRINT 10, R
10    FORMAT (1X,G14.6)
      END

      SUBROUTINE FAT(X, Y, Z)
      Z=X+Y
      RETURN
      END
When the main routine calls FAT, the subroutine's X is 5.0; Y is 
Q+.3, which is 1.7; and Z is R, which is undefined. The 
subroutine sets Z equal to X+Y, which is 6.7. When the computer 
returns to the main routine, the main routine's R is the 
subroutine's Z, which is 6.7. Line 10 prints:
   6.70000
                                         In that CALL, you must 
say 5.0, not 5, since X must be real. Saying 5 will confuse the 
computer and make it print a wrong answer.
  Sum & average of a trio This subroutine finds the sum and 
average of three real numbers ___ X, Y, and Z:
      SUBROUTINE STAT(X, Y, Z, SUM, AVERAG)
      SUM=X+Y+Z
      AVERAG=SUM/3.0
      RETURN
      END
  This main routine uses STAT to find the sum and average of 8.1, 
2.6, and 9.3:
      CALL STAT(8.1, 2.6, 9.3, SUM, AVERAG)
      PRINT 10, SUM,AVERAG
10    FORMAT (1X,2G14.6)
      END
  This subroutine finds the sum and average of three double 
precision numbers:
      SUBROUTINE DSTAT(X, Y, Z, SUM, AVERAG)
      DOUBLE PRECISION X, Y, Z, SUM, AVERAG
      SUM=X+Y+Z
      AVERAG=SUM/3D0
      RETURN
      END
This main routine uses DSTAT to find the sum and average of , e, 
and my phone number (6662666):
      DOUBLE PRECISION SUM, AVERAG
      CALL DSTAT(3.1415926535898D0, 2.7182818284590D0, 6662666D0, 
SUM,
     6AVERAG)
      PRINT 10, SUM, AVERAG
10    FORMAT (1X,2D22.14)
      END
You must say DOUBLE PRECISION in both the main routine and the 
subroutine.
  Sum & average of a long list This subroutine finds the sum and 
average of X1, X2, X3, . . . , XN:
      SUBROUTINE STAT2(X, N, SUM, AVERAG)
      DIMENSION X(N)
      SUM=0.0
      DO 10 I=1,N
         SUM=SUM+X(I)
10    CONTINUE
      AVERAG=SUM/N
      RETURN
      END
  This main routine uses STAT2 to find the sum and average of 
8.4, 9.6, 20.1, 7.2, 91.5, and 3.6:
      DIMENSION X(6)
      DATA X/8.4,9.6,20.1,7.2,91.5,3.6/
      CALL STAT2(X, 6, SUM, AVERAG)
      PRINT 10, SUM,AVERAG
10    FORMAT (1X,2G14.6)
      END
  You must put the DIMENSION statement in both the main routine 
and the subroutine. In the main routine, the DIMENSION must be a 
constant (6); in the subroutine, the DIMENSION can be a variable 
(N).
  This main routine asks you to input some numbers, then prints 
their sum and average by using STAT2:
      DIMENSION X(100)
      PRINT 10
10    FORMAT (1X,'HOW MANY NUMBERS WOULD YOU LIKE TO GIVE ME?')
      READ *, N
      PRINT 20
20    FORMAT (1X,'TYPE THE NUMBERS')
      READ *, (X(I), I=1,N)
      CALL STAT(X, N, SUM, AVERAG)
      PRINT 10, SUM,AVERAG
10    FORMAT (1X,'THE SUM IS',G14.6,' AND THE AVERAGE IS',G14.6)
      END
That DIMENSION statement lets you input up to 100 numbers.
                                                     If a main 
routine says DIMENSION X(100), and X is passed between the main 
routine and the subroutine, the subroutine's DIMENSION statement 
must say no more than X(100): if the subroutine's DIMENSION 
statement says X(N), the N must be no more than 100.
                                                     Passing 
double subscripts For double subscripts, the main routine's 
DIMENSION statement must be exactly the same as the subroutine's.
                                                     For example, 
suppose the main routine says DIMENSION X(25,4). Then the 
subroutine must say DIMENSION X(25,4) also. The subroutine must 
not say DIMENSION X(20,3). If the subroutine says DIMENSION 
X(M,N), the M must be exactly 25.
                                                     Famous 
subroutines The Scientific Subroutine Package (SSP) is a 
collection of subroutines written by IBM that do statistics, 
calculus, equation-solving, and advanced math. The Calcomp 
subroutines make the computer operate a Calcomp plotter (a device 
that draws fancy shapes on paper, by using a felt-tip or 
ballpoint pen).
                                                     Most large 
computers store the SSP and Calcomp subroutines on disk 
permanently. Ask the people in your computer center how to 
combine your own main routines with those subroutines, and how to 
put your own library of subroutines onto the disk.
                                                     How to write 
a big program If you and your friends want to write a big program 
together, divide the problem into a main routine and several 
subroutines, and have each person write one routine.
                                                     Although 
you'll need a group conference to decide what the SUBROUTINE and 
CALL statements will be, you don't have to agree on the names of 
variables, since the names of subroutine variables have nothing 
to do with the names of main-routine variables.
         Your own functions
  Instead of using functions such as SQRT and ABS, you can invent 
your own functions. Here's how to invent a function called F, and 
how to use the function you've invented:
      A=F(5.2)+1.0
      PRINT 10, A
10    FORMAT (1X,G14.6)
      END

      FUNCTION F(X)
      F=2.0*X
      RETURN
      END
  The program consists of two routines. The first routine is the 
main routine. The second routine is the definition of the 
FUNCTION F. Each routine ends with the word END.
  The main routine's top line requires the computer to find 
F(5.2), so the computer hunts for the definition of FUNCTION F. 
The definition says F is twice 5.2, which is 10.4. So A is 11.4. 
The computer will print:
   11.40000
  Like a subroutine, a function definition can be very long and 
have many variables in parentheses.
  Naming your function You can give your function the name F or G 
or any other name, such as MASS. If the function's name begins 
with I, J, K, L, M, or N, the computer will assume its value is 
an integer.
  If you want the function MASS(X) to be double precision instead 
of an integer, begin your main routine by saying ___ 
      DOUBLE PRECISION MASS
and begin your function definition with this line:
      DOUBLE PRECISION FUNCTION MASS(X)

                                                       Files
                                         The computer can write 
its answers onto a data file:
      A=14.6+75.2
      WRITE(3,10) A
10    FORMAT (1X,G14.6)
      WRITE(7,20)
20    FORMAT (1X,'TINA, PLEASE TICKLE MY TUBA')
      END
Since A is 89.8, the second line makes the computer write 89.8 
onto ``file 3'', using line 10's format. The next pair of lines 
make the computer write onto ``file 7'', using line 20's format; 
so the computer will write TINA, PLEASE TICKLE MY TUBA onto file 
7.
                                         Before running that 
program, tell the computer where to put files 3 and 7. You can 
make the computer put them on a disk, line printer, tape, 
terminal, or wherever else you please. Ask the people in your 
computer center how to tell the computer where to put the files.
                                         If your program has many 
statements saying to write onto file 3, the computer will write 
many lines onto file 3, so the file will become long.
                                         Use carriage controls 
only if the file is on a line printer or terminal.
                                         If you say ___ 
      READ(4,30) X
the computer will read the value of X from file 4, using line 
30's format. If you say file 4 is the card reader, the computer 
will wait for you to feed in a card; it you say file 4 is your 
terminal, the computer will wait for you to type on the terminal; 
if you say file 4 is on a tape or disk, the computer will assume 
you created the file before running the program.
                                         For handling files, the 
word READ works even on PDP computers.
                                         For PDP-10 and PDP-20 
computers, here's how to make file 3 be on disk and named JOE. . 
. . Near the beginning of your program, say:
      OPEN(UNIT=3, DEVICE='DSK', FILE='JOE.')
Near the end of your program, say:
      CLOSE(UNIT=3)
