Richard Lowe Jr
Richard Lowe Jr Home

College: FORTRAN Class

Prev

Next

I've learned over a dozen computer languages over the years. I've programmed in BASIC, FORTRAN, C, C+, C++, TECO, PASCAL, PERL, ASP, PHP, assembly and many others. I've even written compilers, assemblers and cross-compilers.

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.