1F O R T R A N77四则运算符+ - */ ** (其中**表示乘方)在表达式中按优先级次序由低到高为:+或-→*或/→**→函数→()2 FORTRAN77变量类型隐含约定:I-N规则凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。
如IMPLICIT REAL (I,J)三种定义的优先级别由低到高顺序为:I-N规则→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型说明语句之前。
数组的说明与使用使用I-N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为1,例:DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3)REAL IA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如WRITE(*,10) ('I=',I,'A=',A(I),I=1,10,2)10FORMAT(1X,5(A2,I2,1X,A2,I4))使用DATA语句给数组赋初值变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何形式的表达式:例如DATA A,B,C/,,DATA A/,B/,C/DATA A,B,C/3*CHARACTER*6 CHN(10)DATA CHN/10*''/INTEGER NUM(1000)DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/3 FORTRAN77程序书写规则程序中的变量名,不分大小写;变量名称是以字母开头再加上1到5位字母或数字构成,即变更名字串中只有前6位有效;一行只能写一个语句;程序的第一个语句固定为PROGRAM 程序名称字符串某行的第1个字符至第5个字符位为标号区,只能书写语句标号或空着或注释内容;某行的第1个字符为C或*号时,则表示该行为注释行,其后面的内容为注释内容;某行的第6个字符位为非空格和非0字符时,则该行为上一行的续行,一个语句最多可有19个续行;某行的第7至72字符位为语句区,语句区内可以任加空格以求美观;某行的第73至80字符位为注释区,80字符位以后不能有内容。
4 FORTRAN77关系运算符.GT. 大于.GE. 天于或等于.LT. 小于.LE. 小于或等于.EQ. 等于.NE. 不等于 .AND. 逻辑与.OR. 逻辑或.NOT. 逻辑非.EQV. 逻辑等.NEQV. 逻辑不等运算符优先级由高到低顺序为:()→**→*或/→+或-→.GT.或.GE.或.LT.或.LE.或.EQ.或.NE.→.NOT.→.AND.→.OR.→.EQV.或.NEQV5 FORTRAN77语句ELSE IF (逻辑表达式N) THEN程序块NELSE程序块N+1END IF7 FORTRAN77循环语句GO TO语句标号程序行程序块GO TO 标号DO语句DO 标号,记数变量=起始值,终止值,步距”语句,如DO 标号,N=1,100,1程序块标号CONTINUEDO WHILE 语句DO 标号程序块标号CONTINUEDO UNTIL语句DO 标号,UNTIL (逻辑表达式)”语句,如DO 标号程序块标号CONTINUE8 FORTRAN77内部函数9 FORTRAN77函数与子程序FORTRAN77语句函数当函数十分简单,用一条语句足以定义时(允许使用继续行)才用;应该放在所有可执行语句之前和有关类型说明语句之后,是非执行语句;只在其所在程序单位中有意义;语句函数中的虚参就是变量名,不能是常量、表达式或数组元素等;语句函数定义语句中的表达式可以包含已经定义过的语句函数、外部函数或内部函数。
语句函数通过表达式得一个函数值,此数值类型必须与函数名的类型一致。
语句函数的使用同内部函数相同。
语句函数例子:ZMJ=YMJ(5)FORTRAN77自定义函数定义格式:类型说明FUNCTION 函数名(虚拟参数1,虚拟参数2,……,虚拟参数N)程序块(可以含有RETURN)函数名=函数值END调用格式与内部函数相同。
FORTRAN77子程序定义格式:SUBROUTINE 子程序名(虚拟参数1,虚拟参数2,……,虚拟参数N)程序块(可以含有RETURN)END调用格式:CALL 子程序名(实在参数1,实在参数2,……,实在参数N)数据块子程序:只是用来给有名公用区中的变量赋初值,格式如下:BLOCK DATA 子程序名DATA语句块END附录一、FORTRAN77控制输入输出格式1.2.3.输出字段宽度不够时用*号填充。
附录二、FORTRAN77控制输入输出格式语句2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortr an90。
ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看77程序。
以下是77和90的一些格式上的区别。
Fortran 77:固定格式(fixed format),程序代码扩展名:.f或.for (1)若某行以C,c或*开头,则该行被当成注释;(2)每行前六个字符不能写程序代码,可空着,或者1~5字符以数字表明行代码(用作格式化输入出等);7~72为程序代码编写区;73往后被忽略;(3)太长的话可以续行,所续行的第六个字符必须是"0"以外的任何字符。
Fortran 90:自由格式(free format),扩展名:.f90 (1)以"!"引导注释;(2)每行可132字符,行代码放在每行最前面;(3)以&续行,放在该行末或下行初。
以下都是讨论Fortran 90。
3、Fortran的一些特点,和C的一些不同其实很多,在下面涉及具体方面时可以看到。
这里只是大致提一些。
(1)不分大小写(2)每句末尾不必要写分号(3)程序代码命令间的空格没有意义(4)不像C,Fortran不使用{ } (5)数据类型多出了复数和逻辑判断类型。
比如复数类型complex :: a!声明复数的方法。
复数显然方便了科学计算,满足了工程方面需求a=,! a=1+i (6)多出了乘幂运算(**)。
乘幂除了整数还可以是实数形式。
如开方,开立方a=**,a=**。
(7)数组有一些整体操作的功能;可以方便的对部分元素进行操作(8)有些情况下可以声明大小待定的数组,很实用的功能4、Fortran 的基本程序结构?先看一看所谓的"Hello Fortran"程序。
?program main!程序开始,main是program的名字,完全自定义?write(*,*) "Hello"!主程序?stop!终止程序?end [program[main]]!end用于封装代码,表示代码编写完毕。
[ ]中的内容可省略,下同。
?再看一段实用一些的程序,好有点感性认识。
程序用于计算圆柱的表面积,要求输入底面半径和。
其中展示了Fortran的一些特色用法。
程序摘自维基。
其实是一个叫的网上引的维基的网页。
推荐去看看!能查到不少有意思的东西。
?program cylinder!给主函数起个名字?! Calculate the area of a cylinder.?! Declare variables and constants.?! constants=pi?! variables=radius squared and height?implicit none! Require all variables to be explicitly declared !这个一般都是要写上的。
下面会进一步说明。
?integer :: ierr?character :: yn?real :: radius, height, area?!这是常量的声明方法?interactive_loop: do!do循环,Fortran 中的循环可以加标签,如d前面的 !interactive_loop就是标签! Prompt the user for radius and height and read them.write (*,*) 'Enter radius and height.'!屏幕输出read (*,*,iostat=ierr) radius,height!键盘输入。
isotat的值用判断输入成功否。
! If radius and height could not be read from input, then cycle through the loop.if (ierr /= 0) then?write(*,*) 'Error, invalid input.'cycle interactive_loop!cycle 相当于C里的continueend if! Compute area. The ** means "raise to a power."area = 2 * pi * (radius**2 + radius*height)! 指数运算比C方便! Write the input variables (radius, height)and output (area) tothe screen.?write (*,'(1x,a7,,5x,a7,,5x,a5,') &!"&"表示续行。
这里还显示了格式化输出'radius=',radius,'height=',height,'area=',area yn = ' '?yn_loop: do!内嵌的另一个do循环?write(*,*) 'Perform another calculation y[n]'?read(*,'(a1)') yn?if (yn=='y' .or. yn=='Y')?exit yn_loop?if (yn=='n' .or. yn=='N' .or. yn==' ')?exit interactive_loop?end do yn_loop!结束内嵌do循环?end do interactive_loop end program cylinder?Fortran 程序的主要结构就是这样了。