# 03 fortran

Post on 20-Nov-2015

7 views

Embed Size (px)

DESCRIPTION

FTRANSCRIPT

CS 415: Programming LanguagesFortranAaron BloomfieldFall 2005

The IBM 704

Standard Fortran joke

GOD is REAL (unless declared INTEGER)."

End of lecture on 26 Aug 2005Between Fortran I and Fortran I program control

Fortran I program control

IF (arithmetic expression) N1, N2, N3

DO N1 variable = first_value, last_value

Punch cards

Fortran history reference

http://www.ibiblio.org/pub/languages/fortran/ch1-1.html

Installing Fortran on WindowsWell use Fortran 77 for this courseThe compiler has some Fortran 90 featuresInstall Cygwin: http://www.cygwin.com/Its a Unix-like shell for WindowsIn particular, when you install it:Install the gcc-g77 package in the Devel sectionWe may use Ocaml if so, then you will need to install the ocaml package (also in Devel)This can be done later, tooInstall a good editorI like Emacs: http://www.gnu.org/software/emacs/emacs.htmlQuite a learning curve, but the best editor out thereBinaries at http://ftp.gnu.org/pub/gnu/emacs/windows/ You can also install and use it as part of CygwinTutorials can be found online

Compiling a Fortran programEdit the program using your favorite editorAll program code must start on the 7th column!In Cygwin, change to that directoryThe c drive is at /cygdrive/c, etc.Enter the command:g77 ff90 file.fThen run the file:./a.exe

Hello world in Fortran

PROGRAM HelloWorld PRINT *,'Hello world!' END PROGRAM HelloWorld

Column 7Column 1

Fortran syntaxLines can only be 72 characters longComments start with a !First 6 columns must be spacesUnless its a commentNo semi-colons after each lineA newline is a statement terminator

Variable declarationThe types are real, integer, etc.

real :: x, y, zinteger :: a, b, ccharacter :: g

Always put implicit none at the beginningRight after the program linePrevents implicit variable declaration

Input and outputOutput statement:print *, "(", tri1x, ", ", tri1y, ")

Input statement:read *, tri3x

There are ways to do nicely formatted outputWe arent going over them

OperatorsBoolean operators: .and., .or., .not., etc.Basically the name of the operation in periodsBoolean values are .true. and .false.

Relational operators: , =, ==, /=

Built-in functionssqrt()log()sin()cos()exp()etc.

If statementsForms are (exp is a Boolean expression):

if (exp ) then ...endif

if ( exp ) then ...else ...endifif ( exp ) then ...else if ( exp ) then ...else if ( exp ) then ...endif

Case statementForm is:

select case ( expr )case ( value ) ...case ( value ) ...case ( value ) ...case default ...end caseWhere value can be:A single value(300:)A range of values(200:400)

Case default is not required

LoopingForm is:

do i = 1, 10 ...end do

do i = 1, 10, 2 ...end do

The first loops from 1 to 10

The second loops from 1 to 10, but odd numbers only

Loop controlExitExits the loop, not the program

CycleSimilar to next or continue in other languagesStarts the next iteration of the loop

Demo program! This program allows the user to input the number of degrees in an angle! and then computes the cosine, sine, and tangent. It continues until the! user inputs "n" or "N". PROGRAM angle IMPLICIT none! Type variables. REAL :: cosine, sine, tangent, degrees REAL :: pi = 3.141592 CHARACTER :: choice DO! Enter and read the number of degrees in the angle. PRINT *, "Enter the number of degrees in the angle." READ *, degrees! Convert number of degrees in angle to radians. degrees = degrees*(pi/180)! Use intrinsic functions to compute values. cosine=cos(degrees) sine=sin(degrees) tangent=tan(degrees)! Print results. PRINT *, "cosine=", cosine, " sine=", sine, " tangent=", tangent! Give user chance to exit program. PRINT * PRINT *, "Would you like to do this again?" PRINT *,"(Press n to exit - any other key to continue.)" READ *, choice! Exit loop if the value in choice is N or n. IF (choice == "N" .or. choice == "n") EXIT END DO STOP END PROGRAM angleComputes the sin, cos, tan, etc.

Demo program! This program averages a series of numbers input ! from the keyboard. PROGRAM average IMPLICIT none! Type variables. REAL :: data, sum, avg INTEGER num, i! Prompt for and enter number of numbers to average. PRINT *,"Enter the number of numbers to average." READ *,num sum = 0.0! Loop goes from 1 to number of values to average. DO i = 1, num! Prompt for and enter a number. PRINT *,"Enter a value for the number" READ *,data! Add number to total. sum = sum + data END DO! Calculate average. avg = sum/real(num)! Print results. PRINT *,"The average = ",avg STOP ENDComputes the average

Demo program! This program uses a function to find the average of three numbers. PROGRAM func_ave! Type variables in main program (a, b, and c are local variables). REAL :: a,b,c,average! Prompt for and get numbers to be averaged. PRINT *,"Enter the three numbers to be averaged." READ *, a,b,c! Invoke function average PRINT *,"The three numbers to be averaged are ",a,b,c PRINT *,"The average of the three numbers is ", average(a,b,c) STOP END PROGRAM func_ave! Function average REAL FUNCTION average(x,y,z)! Type variables in function (x, y, and z are local varialbes). REAL :: x,y,z! Function name contains the average the function calculates and returns. average = (x + y + z)/3.0 RETURN END FUNCTION averageComputes the average via a defined function

Fortran gotchasAll variables must be declared at the beginningRemember line limit of 72 characters!Consider:

The 8th variable is named eiThere is no 9th variable declaredNo continuation lines in Fortran 77== is comparison for if'sCant seem to be able to change the values of parameters in functionsinteger :: first, second, third, fourth, fifth, sixth, seventh, eighth, ninthColumn 72!

End of lecture on 29 Aug 2005Next 3 slides gone over a few days later

John BackusChemistry major at UVA (entered 1943)Flunked out after second semesterJoined IBM as programmer in 1950Developed Fortran, first commercially successful programming language and compiler

IBM 704 Fortran manual, 1956

Fortran issuesFortran language was described using EnglishImpreciseVerbose, lots to readAd hocDO 10 I=1.10Assigns 1.10 to the variable DO10I Early Fortrans didnt care about spaces!DO 10 I=1,10Loops for I = 1 to 10(Often incorrectly blamed for loss of Mariner-I)

Recommended