
After completing the BASIC class, I decided it would be useful to be exposed to another computer language. The college offered two other language courses - FORTRAN and MACRO. I signed up for both classes at the same time, since each appeared to be somewhat interesting.
As it turned out, the FORTRAN class was very tedious. Mr. James, the head of the computer science department, taught the class. He was a great teacher, but the subject matter was dry and uninteresting and even he couldn’t bring it to life.
FORTRAN is an awkward language to use. It is one of the oldest languages, and so doesn’t have many of the niceties of the newer ones like BASIC. It has many idiosyncrasies left over from those early days. You see, FORTRAN was originally designed to be programmed on punch cards. So, even though nobody uses punch cards anymore, we had to make sure that line numbers began in column one, commands in column 7 and continuation in column 6. It was all very irritating, especially after the free flowing capabilities of BASIC.
C-- PROGRAM #2 C-- RICHARD LOWE C-- C-- THIS PROGRAM COMPUTES THE COM- C-- OUNDED INTERST ON AN INPUTED C-- INVESTMENT AT AN INPUTED INTEREST RATE C-- OVER AN INPUTED PERIOD OF YEARS. C-- C-- P = INITIAL INVESTMENT C-- RATE = INTEREST RATE C-- N = THE DURATION OF ACCOUNT C-- A = THE ACCUMULATED SUM C-- WRITE(7,14) 14 FORMAT(1X, 'PLEASE INPUT PRICIPLE, INTEREST AND DURATION.') READ(5,15) P,RATE,N 15 FORMAT(F,F,I) A=P*(1.+RATE)**N WRITE(7,17)P,RATE,N,A 17 FORMat(1X,'P= ',F,5X,'RATE= ',F,5X,'N= ',I/1X,'A= ',F) STOP END
C-- PROGRAM #3 C-- RICHARD LOWE C-- C-- THIS PROGRAM ADDS UP C-- ALL OF THE ODD INTEGERS C-- FROM 1 TO 199. C-- INTEGER SUM SUM=0 TOTAL=0 N=1 10 SUM=SUM+N TOTAL=TOTAL+FLOAT(N) N=N+2 IF(N.LE.199)GO TO 10 WRITE(7,17)SUM,TOTAL 17 FORMAT(1X,'SUM= ',I6,5X,'TOTAL= ',F9.2/) STOP END
C-- PROGRAM 4A C-- RICHARD LOWE C-- C-- THIS PROGRAM WILL FIND THE FACTORIAL C-- OF A NUMBER IF THAT NUMBER IS LESS C-- THAN 7. C-- WRITE(7,75) 75 FORMAT(1X,'PLEASE TYPE A POSITIVE INTEGER.'//) READ(5,15)K 15 FORMAT(I) IF (K.EQ.0) GO TO 100 IF (K.LT.0) GO TO 200 KFAC=K IF (K.EQ.1) GO TO 90 KOUNT=K-1 50 KFAC=KFAC*KOUNT KOUNT=KOUNT-1 IF (KOUNT.GT.1) GO TO 50 90 WRITE(7,70)KFAC 70 FORMAT(1X,'KFAC=',I//) STOP 100 WRITE(7,17) 17 FORMAT(1X,'0! IS DEFINED AS 1.'//) STOP 200 WRITE(7,18) 18 FORMAT(1X,'KFAC IS UNDEFINED.'//) STOP END
C-- PROGRAM 4B C-- RICHARD LOWE C-- C-- THIS PROGRAM WILL FIND C-- THE FACTORIAL OF ANY NUMBER C-- THAT THE COMPUTER WILL HANDLE C-- WITHOUT A NERVOUS BREAKDOWN. C-- C-- WRITE(7,75) 75 FORMAT(1X,'PLEASE TYPE A POSITIVE INTEGER.') READ(5,15)K 15 FORMAT(I) IF (K.LT.0) GO TO 100 IF (K.EQ.0) GO TO 200 KFAC=K IF (K.EQ.1) GO TO 90 KOUNT=K-1 IF (K.GT.7) GO TO 700 50 KFAC=KFAC*KOUNT KOUNT=KOUNT-1 IF (KOUNT.GT.1) GO TO 50 90 WRITE(7,70) KFAC 70 FORMAT(1X,'KFAC=',I/) STOP 100 WRITE(7,17) 17 FORMAT(1X,'KFAC IS UNDEFINED!'/) STOP 200 WRITE(7,18) 18 FORMAT(1X,'0! IS DEFINED AS 1.') STOP 700 FAC=FLOAT(K) 750 KOUNT=KOUNT-1 FAC=FAC*FLOAT(KOUNT) IF (KOUNT.GT.1) GO TO 750 WRITE(7,770)FAC,FAC 770 FORMAT(1X,'FAC=',F,5X,E/) STOP END
C-- PROGRAM #5
C-- RICHARD LOWE
C--
C-- THIS PROGRAM WILL COMPUTE MONTHLY HOME
C-- MORTAGAGE COSTS, READING THE DATA
C-- FROM A DATA FILE AND OUTPUTING THE RESULT TO
C-- ANOTHER DATA FILE.
C--
CALL ASSIGN(5,'LOWE5.BRN')
CALL ASSIGN(6,'LOWE05.DAT')
BYTE NAME(80)
100 FORMAT(80A1)
110 FORMAT(F,F,I)
200 FORMAT('1',9X,'TIGHTWAD SAVINGS AND LOAN 700 SLAGPILE DRIVE
1 PITTSBURGH, PENNA.'////,10X,'MORTGAGE COMPUTATION FOR ',
280A1,//,10X,'AMOUNT OF LOAN: $',F6.0//,
310X,'ANNUAL INTEREST RATE: ',F6.2,' PERCENT'//,
410X,'DURATION OF LOAN: ',I4,' YEARS '////)
220 FORMAT(10X,'MONTHLY PAYMENT: $',F6.2,////)
300 FORMAT(3X,'PAYMENT',3X,'MONTHLY',3X,'MONTHLY',4X,'CUMULATIVE',
13X,'OUTSTANDING'/,
23X,'NUMBER',4X,'INTEREST',2X,'REPAYMENT',2X,'INTEREST',5X,
3'BALANCE'//)
330 FORMAT(4X,I3,7X,F6.2,4X,F6.2,4X,F8.2,5X,F8.2)
C-- READ INPUT
READ(5,100)NAME
READ(5,110)A,RATE,N
WRITE(6,200)NAME,A,RATE,N
C-- COMPUTE MONTHLY PAYMENT
N1=12*N
TEMP=.01*RATE/12.
CONST=(1.+TEMP)**N1
P=TEMP*A*(CONST/(CONST-1))
WRITE(6,220)P
C-- INITIALIZE AND WRITE COLUMN HEADINGS
SUM=0
B=A
WRITE(6,300)
C-- COMPUTE MONTHLY AND CUMULATIVE CHARGE
DO 1 I=1,N1
XINT=TEMP*B
T=P-XINT
SUM=SUM+XINT
B=B-T
IF (B.LT.0)B=0
1 WRITE(6,330)I,XINT,T,SUM,B
STOP
END
C-- PROGRAM #5
C-- RICHARD LOWE
C--
C-- THIS PROGRAM WILL COMPUTE MONTHLY HOME
C-- MORTAGAGE COSTS, READING THE DATA
C-- FROM A DATA FILE AND OUTPUTING THE RESULT TO
C-- ANOTHER DATA FILE.
C--
CALL ASSIGN(5,'LOWE5.BRN')
CALL ASSIGN(6,'LOWE05.DAT')
BYTE NAME(80)
100 FORMAT(80A1)
110 FORMAT(F,F,I)
200 FORMAT('1',9X,'TIGHTWAD SAVINGS AND LOAN 700 SLAGPILE DRIVE
1 PITTSBURGH, PENNA.'////,10X,'MORTGAGE COMPUTATION FOR ',
280A1,//,10X,'AMOUNT OF LOAN: $',F6.0//,
310X,'ANNUAL INTEREST RATE: ',F6.2,' PERCENT'//,
410X,'DURATION OF LOAN: ',I4,' YEARS '////)
220 FORMAT(10X,'MONTHLY REPAYMENT: $',F6.2,////)
300 FORMAT(3X,'PAYMENT',3X,'MONTHLY',3X,'MONTHLY',4X,'CUMULATIVE',
13X,'OUTSTANDING'/,
23X,'NUMBER',4X,'INTEREST',2X,'PAYMENT',4X,'INTEREST',5X,
3'BALANCE'//)
330 FORMAT(4X,I3,7X,F6.2,4X,F6.2,4X,F8.2,5X,F8.2)
C-- READ INPUT
READ(5,100)NAME
READ(5,110)A,RATE,N
WRITE(6,200)NAME,A,RATE,N
C-- COMPUTE MONTHLY PAYMENT
N1=12*N
TEMP=.01*RATE/12.
T=A/N1
WRITE(6,220)T
C-- INITIALIZE AND WRITE COLUMN HEADINGS
SUM=0
B=A
WRITE(6,300)
C-- COMPUTE MONTHLY AND CUMULATIVE CHARGE
DO 1 I=1,N1
XINT=TEMP*B
P=T+XINT
SUM=SUM+XINT
B=B-T
IF (B.LT.0)B=0
1 WRITE(6,330)I,XINT,P,SUM,B
STOP
END
C PROGRAM #7 C RICHARD LOWE C C THIS PROGRAM READS UP TO 100 DIFFERENT TEMPERATURES C FROM A DATA FILE, (IN.DAT), FINDS THE AVERAGE, AND C OUTPUTS THE RESULT TO THE KEYBOARD. C C TEMP(100)=THE TEMPERATURES ORIGANALLY READ FROM THE C DATA FILE. C SUM=THE TEMPORARY HOLDING BOX WHICH CONTAINS THE C SUM OF ALL THE TEMPERATURES. C ANSWR=THE BOX WHICH HOLS THE AVERAGE TEMPERATURE. C I=THE NUMBER OF TEMPERATURES WHICH THE AVERAGE IS C TO BE FOUND. C DEV=THE DEVIATION OF EACH TEMPERATURE FROM THE C AVERAGE. C C CALL ASSIGN(7,'LP:') CALL ASSIGN(12,'IN.DAT') C C DIMENSION TEMP FOR UP TO 100 PIECES OF DATA. C REAL TEMP(100) 60 FORMAT(1X,'FORTRAN PROGRAM #7',10X,'APRIL 4, 1979'////) 70 FORMAT(100F) 75 FORMAT(I) 85 FORMAT(1X,'TEMPERATURE:',F8.2,' DEVIATION:',F8.2) 80 FORMAT(1X,'THE AVERAGE TEMPERATURE IS ',F8.2//) C C READ IN THE NUMBER WHICH TELLS HOW MANY MORE NUMBERS TO READ. C READ(12,75)I C C READ IN THE TEMPERATURES. C READ(12,70)(TEMP(J),J=1,I) WRITE(7,60) C C START ADDING UP THE TEMPERATURES. C DO 100 J=1,I SUM=SUM+TEMP(J) 100 CONTINUE C C FIND THE AVERAGE TEMPERATURE. C ANSWR=SUM/I WRITE(7,80)ANSWR C C CALCULATE THE DEVIATION AND WRITE OUT THE RESULTS. C DO 300 J=1,I DEV=TEMP(J)-ANSWR WRITE(7,85)TEMP(J),DEV 300 CONTINUE STOP END
C-- THIS PROGRAM WILL READ IN A SET OF 14 NAMES, C-- WITH SIX TEST SCORES EACH, AND COMPUTE A WEIGHTED C-- AVERAGE OF THEM. C-- C-- A(6)=STUDENT SCORES C-- NAME= NAME OF THE STUDENT C-- S1=AVERAGE FOR FIRST 40% OF SCORES C-- S2=AVERAGE FOR SECOND 60% OF SCORES C-- AVERAGE=SUM OF S1+S2 C-- REAL A(6) BYTE NAME(20) CALL ASSIGN(12,'LOWE8.DAT') C OPEN THE LINE PRINTER AS AN OUTPUT FILE CALL ASSIGN(11,'LP:') 1 FORMAT(6F,20A1) 2 FORMAT(1X,20A1,6F9.2,4X,F9.2) 3 FORMAT(1X,'STUDENT NAME'35X,'SCORES',27X,'AVERAGE'//) 4 FORMAT(1X,'RICHARD LOWE'/,1X,'PROGRAM #8'///) C WRITE THE PRORAM RUN HEADER WRITE(11,4) WRITE(11,3) C START COMPUTING THE AVERAGE DO 50 I=1,14 READ(12,1)(A(J),J=1,6),NAME S1=0. DO 55 J=1,4 S1=S1+A(J) 55 CONTINUE S1=S1*.15 S2=0. DO 60 J=5,6 S2=S2+A(J) 60 CONTINUE S2=S2*.2 AVERGE=S2+S1 C WRITE OUT THE RESULTS WRITE(11,2)NAME,(A(J),J=1,6),AVERGE 50 CONTINUE STOP END
ADAMS,45,80,80,95,55.75
C-- PROGRAM #9 C-- RICHARD LOWE C-- C-- THIS PROGRAM WILL READ A SET OF UP TO 100 STUDENTS NAMES, C-- AND 100 SETS OF 6 SCORES EACH, AND COMPUTE A WEIGHTED C-- AVERAGE. IT WILL ALSO COMPUTE THE CLASS AVERAGE AND THE C-- DEVIATION OF EACH STUDENT FROM THIS AVERAGE. C-- C-- KCOUNT=THE NUMBER OF STUDENTS C-- S1=PART ONE OF THE WEIGHTED AVERAGE C-- PART TWO OF THE WEIGHTED AVERAGE C-- SCORES(100,6)=THE STUDENTS 6 SCORES TO BE AVERAGED C-- AVERGE=THE CLASS AVERAGE TO BE COMPUTED C-- AVERAG(100)=THE COMPUTED AVERAGES OF EACH STUDENT C-- NAME(100,20)=THE NAME OF EACH STUDENT C-- DEV=THE DEVIATION OF EACH STUDENT FROM THE CLASS AVERAGE C-- C-- CALL ASSIGN(12,'LOWE8.DAT') CALL ASSIGN(11,'LP:') BYTE NAME(100,20) COMMON SCORES(100,6),AVERAG(100) 1 FORMAT(6F,20A1) 2 FORMAT(1X,'PROGRAM #9',/,1X,'RICHARD LOWE'///, 11X,'THE CLASS AVERAGE IS ',F9.2,// 247X,'SCORES',28X,'AVERAGE',5X,'DEVIATION'//) 4 FORMAT(1X,20A1,6F9.2,3X,F9.2,3X,F9.2) C READ IN THE STUDENTS SCORES ALL AT ONCE AND STORE IN SCORES(100), C EXIT LOOP WHEN THE LAST STUDENTS NAME AND SCORE IS READ. DO 5 KCOUNT=1,100 READ(12,1,END=10)(SCORES(KCOUNT,J),J=1,6),(NAME(KCOUNT,I),I=1,20) 5 CONTINUE 10 KCOUNT=KCOUNT-1 AVERGE=0. C START COMPUTATION OF STUDENTS AVERAGE. DO 70 I=1,KCOUNT S1=0. DO 60 N=1,4 S1=S1+SCORES(I,N) 60 CONTINUE S1=S1*.15 S2=0. DO 50 N=5,6 S2=S2+SCORES(I,N) 50 CONTINUE S2=S2*.2 AVERAG(I)=S2+S1 C START COMPUTATION OF CLASS AVERAGE AVERGE=AVERGE+AVERAG(I) 70 CONTINUE C FIND THE AVERAGE OF THE CLASS AVERGE=AVERGE/KCOUNT WRITE(11,2)AVERGE DO 90 N=1,KCOUNT C FIND OUT HOW MUCH EACH STUDENT DEVIATES FROM THE AVERAGE DEV=AVERAG(N)-AVERGE WRITE(11,4)(NAME(N,I),I=1,20),(SCORES(N,J),J=I,6),AVERAG(N),DEV 90 CONTINUE STOP END
DOUBLE PRECISION F3 INTEGER F1 REAL F2 CALL ASSIGN(7,'LP:') CALL ASSIGN(6,'KB:') WRITE(6,5) 5 FORMAT(1X,'PLEASE TYPE A POSITIVE INTEGER') READ(5,70)N 70 FORMAT(I) IF(N.LT.0)GOTO 100 IF(N.EQ.0)GOTO 200 IF(N.EQ.1)GOTO 300 IF(N.LE.7)WRITE(7,75)F1(N) 75 FORMAT(1X,'INTEGER FACTORIAL IS ',I10) WRITE(7,80)F2(N),F3(N) 80 FORMAT(1X,'FLOATING POINT FACTORIAL IS ', F10.0, 1/1X,'DOUBLE PRECISION FACTORIAL IS ', D) STOP 100 WRITE(7,110) 110 FORMAT(1X,'NEGITIVE FACTORIAL IS UNDEFINED!') STOP 200 WRITE(7,210) 210 FORMAT(1X,'0! IS DEFINED AS ONE.') STOP 300 WRITE(7,310) 310 FORMAT(1X,'THE FACTORIAL OF ONE IS ONE.') STOP END
INTEGER K(50) CALL ASSIGN(9,'LP:') CALL ASSIGN(1,'P11.DAT') DO 100 I=1,50 READ(1,15,END=101) K(I) 100 CONTINUE 15 FORMAT(I) 101 N=I-1 WRITE(9,6) WRITE(9,70)(K(I),I=1,N) 6 FORMAT(1X,'ORIGANAL ORDER OF LIST') 70 FORMAT(1X,10I5) WRITE(7,75) 75 FORMAT(1X,'PLEASE INPUT ONE OF THE FOLLOWING #S',/, 11X,'1) SORTED IN DESCENDING ORDER',/, 21X,'2) SORTED IN DESCENDING ORDER BY MAGNITUDE',/, 31X,'3) SORTED IN ASCENDING ORDER',/, 41X,'4) SORTED IN ASCENDING ORDER BY MAGNITUDE') 79 READ(5,50)KODE 50 FORMAT(I) IF(KODE.EQ.0)STOP CALL SORT(K,N,KODE) WRITE(9,7) 7 FORMAT(1X,'SORTED ORDER OF LIST') WRITE(9,80)(K(I),I=1,N) 80 FORMAT(10I10) WRITE(7,90) 90 FORMAT(1X,'NEXT CHOICE') GOTO 79 END
COMMON C(100), CX INTEGER A(50),B(50),C,AX,BX,CX 5 FORMAT(50I) 20 FORMAT(/,1X,'SET NUMBER',I2,' OF',I3,' NUMBERS.'/) 25 FORMAT(10I10/) 30 FORMAT(/,1X,'SET NUMBER',I2,' IN ASCENDING ORDER'/) 40 FORMAT(1X,'THE MERGED FILES',/) C-- ASSIGN BOTH DATA FILES CALL ASSIGN(1,'P12A.DAT') CALL ASSIGN(2,'P12B.DAT') CALL ASSIGN(3,'LP:') READ(1,5)N,(A(I),I=1,N) READ(2,5)M,(B(I),I=1,M) K=1 WRITE(3,20)K,N WRITE(3,25)(A(I),I=1,N) K=2 WRITE(3,20)K,M WRITE(3,25)(B(I),I=1,M) CALL SORT(A,N) K=1 WRITE(3,30)K WRITE(3,25)(A(I),I=I,N) CALL SORT(B,M) K=2 WRITE(3,30)K WRITE(3,25)(B(I),I=1,M) CALL MERGE(A,N,B,M) WRITE(3,40) WRITE(3,25)(C(I),I=1,CX) STOP END
I wrote the programs above for my FORTRAN class. These were some of the first FORTRAN programs that I ever wrote.
Unless otherwise noted, all photos and text is Copyright © Richard G Lowe, Jr.