Fortran之COMMON语句

合集下载

fortran用法小结

fortran用法小结

fortran用法小结Fortran用法小结目录:一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。

只读到第九章,主要是3~9 章,都是最基本的用法(原书共16章)。

这里主要摘录了我看书过程中总结的一些Fortran 和C不同的地方,主要是语法方面。

希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。

要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九应该很快的,花一两天就行了。

觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。

外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没得及仔细想,只是按着作者的意思去理解。

所以这份笔记还处于纸上谈兵的层次。

如果有不妥的方,希望大家指正。

谢谢!文中蓝色的部分是程序代码,!后面的内容为注释。

二、概述1、名词解释Fortran=Formula Translator/Translation一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。

的确,从一开始,IBM设计的时候就是为了方便数值计算和科学数据处理。

设计强大的数组操作就是为了实现这一目标。

Fortran奠定了高级语言发展的基础。

现在Fortran在科研和机械方面应用很广。

2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。

现在在广泛使用的是Fortran 77和Fortr an90。

Fortran 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语言语法

fortran语言语法

FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用。

经过40多年的发展,伴随着FORTRAN语言多次版本的更新及相应开发系统的出现,其功能不断完善,最新版本的开发系统几乎具备了VC、VB的所有特点,如图形界面编程、数据库等。

目前,工科院校开设的计算机编程语言课首选仍然是FORTRAN :<说实话,从科技发展的趋势来说这不是好事。

您可以设想一下,如果需要用鹅毛笔抄写大量的古籍是什么感受!强烈建议阅读《发掘C#特性赋予科学计算项目以威力》1 FORTRAN77四则运算符+ - * / ** (其中**表示乘方)在表达式中按优先级次序由低到高为: +或-→*或/→**→函数→()2 FORTRAN77变量类型隐含约定:I-N规则凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。

用类型说明语句确定变量类型:可以改变I-N规则用IMPLICIT语句将某一字母开头的全部变量指定为所需类型如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字符位以后不能有内容。

fortran语言语法

fortran语言语法

FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用。

经过40多年的发展,伴随着FORTRAN语言多次版本的更新及相应开发系统的出现,其功能不断完善,最新版本的开发系统几乎具备了VC、VB的所有特点,如图形界面编程、数据库等。

目前,工科院校开设的计算机编程语言课首选仍然是FORTRAN :<说实话,从科技发展的趋势来说这不是好事。

您可以设想一下,如果需要用鹅毛笔抄写大量的古籍是什么感受!强烈建议阅读《》1 FORTRAN77四则运算符+ - * / ** (其中**表示乘方)在表达式中按优先级次序由低到高为:+或-→*或/→**→函数→()2 FORTRAN77变量类型隐含约定:I-N规则凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。

用类型说明语句确定变量类型:可以改变I-N规则用IMPLICIT语句将某一字母开头的全部变量指定为所需类型如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字符位以后不能有内容。

Fortran 程序基础

Fortran 程序基础
(3)引用数组片段 数组名(下标范围)
2021/7/1
26
数组操作
PROGRAM TEST IMPLICIT NONE ! 变量定义 REAL :: A1, A2,A3,A4,A5,B(5,5) READ(*, *)A1,A2,A3,A4,A5 ! 数组片断的引用 B(1,1:5) = A1 B(2,1:5) = A2 B(3,1:5) = A3 B(4,1:5) = A4 B(5,1:5) = A5
数组可用DIMENSION语句定义 DIMENSION runoff(365) Real runoff ※使用数组必须先定义
2021/7/1
25
数组操作
数组引用
(1)引用数组元素 数组名(下标),如 runoff(15),rain(3,5)
(2)引用全部数组 数组名,如: real B(10),A(10) B=A
2021/7/1
8
数据类型及I/0格式
变量的定义及类型说明:
(1)类型说明语句
integer year, month, day
real runoff
character*10 station
(2)隐含约定
I~N 规则
2021/7/1
9
数据类型及I/0格式
输入、输出语句
READ(设备号, 格式说明或格式说明语句标号) [变量列表] WRITE (设备号, 格式说明或格式说明语句标号) [变量列表]
其他程序控制语句 End Pause stop
2021/7/1
22
Fortran程序流程控制
实例分析
(1)1~100求和 (2)输入5个数,按大小排序
2021/7/1
23
数组操作

FORTRAN常用命令

FORTRAN常用命令

FORTRAN常⽤命令FORTRAN 77语句形式表ASSIGN S TO i BACKSPACE u BACKSPACE (alist) BLOCK DA TA [sub] CALL sub CHARACTER COMMON COMPLEX CONTINUEDA TA DIMENSIONDODOUBLE PRECISION ELSE IF (e) THEN ENDFILE u ENDFILE (alist) ENTRYEQUIV ALENCE EXTERNAL Proc FORMA T fs[typ]FUNCTION fun () GO TO iGO TO sGO TO 标号赋值语句回退语句数据块⼦程序语句引⽤⼦程序语句字符型说明语句公共语句复型说明语句继续语句数据初值语句数组说明语句循环语句双精度型说明语句ELSE IF语句⽂件结束语句⽂件结束语句⼊⼝语句等价语句外部语句格式语句函数⼦程序语句赋值GOTO语句⽆条件GOTO语句计算GOTO语句IF (e) stIF (e) S1,S2,S3 IF (e) THEN IMPLICIT typ INQUIRE INQUIRE INTEGER INTRINSIC LOGICAL OPEN PARAMETER PAUSE PRINT PROGRAM READREADREAL RETURN REWIND REWINDSA VESTOP SUBROUTINE WRITE 逻辑IF语句算术IF语句块IF语句类型隐含说明语句按⽂件询问语句按设备询问语句整型说明语句内部语句逻辑型说明语句⽂件打开语句参数语句暂停语句打印语句程序语句读语句实型说明语句返回语句反绕语句反绕语句保存语句停⽌语句⼦例⾏⼦程序语句输出语句。

Fortran—函数

Fortran—函数

Fortran—函数1.子程序subroutine的使用子程序由call调用,程序以subroutine开头,以end结束子程序最后一个命令通常是return,表示程序要返回原来调用它的地方继续执行子程序和主程序声明的变量和行代码相互独立2.传递参数:在调用子程序时:call add(a,b) !把变量ab交给子程序add来处理传递参数使用同一个内存地址,一个变就都变了重点:传递参数前后类型要一致3.自定义函数调用自定义函数前要先声明自定义函数执行后会返回一个数值声明:类型,extenral::函数名函数:Function函数名(参数)函数返回值类型声明可以写在函数的最开头,跟function写在一起。

Eg, real function add (a,b) !声明函数add的返回值为浮点数调用:直接写函数名即可4.全局变量common:用来定义一块共享空间,可在程序中任何部分被取用取用全局变量时,是根据他们声明时的相对位置关系来做对应,而不是使用变量名称做对应。

可以吧全局变量归类,放在彼此独立的common区间中。

Eg common /group1/acommon /group2/b5.传递参数与全局参量:若共享数据不多,或者只有少数几个程序需要使用这些数据时,那就使用参数;需要共享大批数据,或者很多不同程序都需要这些数据时,使用全局变量6.block data用来设置common变量的初值结构:Block data name !name可以省略Implicit none !最好不要省略Integer … !声明变量Real …Common … !把变量放到common空间中Common /group1/ …Data var1,var2 … !同样适用data设定初值…………End block data name !可以只写end或者 end block data7.变量的生存周期函数中的变量会随子程序的的结束而被淹没,在声明中加入save可以增加变量的生存周期,保留住所保存的数据。

第10章 Fortran程序单元

第10章  Fortran程序单元
第10章 Fortran程序单元
• 一个Fortran程序中通常不是只由一个主程序组成, 而是由几个按某种方式划分的不同程序单元来共 同组成。尽管Fortran程序中允许只有主程序而没 有子程序,但绝不允许只有子程序而没有主程序。 在Fortran中,程序的执行总是从主程序开始的。 • Fortran中的程序单元可以大体划分为主程序、子 程序两种,其中子程序又可以进一步划分为函数 子程序、子例行子程序和数据块子程序。数据块 子程序通常用于实现变量的初始化赋值,函数子 程序和子例行子程序在用途上基本是一致的,但 是也有许多不同之处。本章将详细介绍Fortran中 的程序单元和它们的基本用法。
10.4 子例行子程序
• 同函数子程序相比,子例行子程序通常用于完成 更为复杂的任务。子例行子程序接受外界传入的 参数并对其进行处理,子例行程序名不会用来返 回处理结果。形象一点来说,函数子程序像检验 机,它不改变参数的值但会告诉外界一个检测结 果;而子例行子程序更像一个加工机器,外界来 的参数经过它的加工会以新的形象出现。本节主 要介绍子例行子程序的相关知识。
10.5 子程序的多入口点和多折返点
• 尽管子程序中不允许直接定义其他的子程序,但 是在Fortran 77时代,可以通过特殊的方式在同 一个子程序中定义多个不同的过程入口。通过调 用不同的过程定义来实现调用同一个子程序中的 不同执行段。除了提供多入口点外,Fortran 77 时代也提供特殊的多折返点来实现特定条件的子 程序调用返回方式。
10.6 Fortran 90/95中的特殊子程序类型
• 在Fortran 90/95标准中,除了继续对前述的一般 子程序类型提供支持外,还新增了三种特殊的子 程序类型。这三种子程序类型就是前述章节中曾 经提到过的RECURSIVE、PURE和ELEMENTAL三种属 性。RECURSIVE属性允许过程进行自身调用,也就 是常说的递归调用;PURE和ELEMENTAL属性都用于 数组的并行处理。

全国计算机考试四级的软件设计复习纲要

全国计算机考试四级的软件设计复习纲要

全国计算机考试四级的软件设计复习纲要在明确了用户的需求以后,下一步的任务就是对未来的软件系统进行设计。

软件设计通常可分为概要设计和详细设计。

概要设计的任务是确定软件系统的结构,进行模块划分,确定每个模块的功能、接口以及模块间的调用关系。

详细设计的任务是为每个模块设计实现的细节。

此外,在概要设计阶段还应对全局数据结构进行设计,详细设计阶段还应对局部数据结构进行设计。

有的设计方法不区分概要设计和详细设计,统称为软件设计。

人们在开发过程中,总结出许多软件设计的概念和原则,这些概念和原则对提高软件的设计质量有很大的帮助。

1.抽象抽象是指忽视一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

抽象是认识复杂问题的过程中人类使用的最有力的思维工具,它抽取出事物的本质特性而暂时不考虑它的细节。

软件工程中从软件定义到软件开发要经历多个阶段,在这个过程中每前进一步都可看作是对软件解法的抽象层次的一次细化。

抽象的最低层次就是实现该软件的源程序代码。

在进行模块化设计时可以有多个抽象层次,最高抽象层次的模块用概括的方式叙述问题的解法,较低抽象层次的模块是对较高的抽象层次模块对问题解决描述的细化。

过程抽象和数据抽象是常用的两种主要抽象手段。

过程抽象是指任何一个完成明确功能的`操作都可被使用者当作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。

过程抽象常常也称为功能/子功能抽象。

例如函数、子程序。

数据抽象定义了数据类型和施加于该类型的操作,并限定了对象值的范围,只能**使用这些操作修改和观察这些数据。

例如抽象数据类型。

2.模块化模块化是指将一个待开发的软件分解成若干个小的简单的部分———模块,每个模块可独立地开发、测试,最后组装成完整的程序。

这是一种复杂问题的“分而治之”的原则,模块化的目的是使程序的结构清晰,容易阅读,容易理解,容易测试,容易修改。

模块是指执行某一特定任务(也可以是实现某一特定的抽象数据类型)的数据结构和程序代码。

Fortran语言编程小结(五篇材料)

Fortran语言编程小结(五篇材料)

Fortran语言编程小结(五篇材料)第一篇:Fortran语言编程小结1.单双精度Program ex01 implicit none real(kind=4):: a real(kind=8):: b a=3.***66666666_4!确定这个数字是使用单精度 b=3.***66666666_8!确定这个数字是使用双精度 write(*,*)a,b End program ex012.判断kind值 program ex02 Implicit none!判断可以记录9个位数的整数kind值integer, parameter :: long_int = selected_int_kind(9)!判断可以记录3个位数的整数kind值integer, parameter :: short_int = selected_int_kind(3)!判断可以有3个有效位数, 指数可以记录到3的浮点数kind值integer, parameter :: long_real = selected_real_kind(10, 50)!判断可以有10个有效位数, 指数可以记录到50的浮点数kind值integer, parameter :: short_real= selected_real_kind(3, 3)integer(kind=long_int):: a = 123456 integer(kind=short_int):: b = 123 real(kind=long_real):: c = +1.23456789D45 real(kind=short_real):: d =+1230 write(*, “(I3,1X,I10)”)long_int,a write(*, “(I3,1X,I10)”)short_int, b write(*, “(I3,1X,E10.5)”)long_real, c write(*, “(I3,1X,E10.5)”)short_real, d END3.TYPE program ex0434 implicit none Type :: person!开始建立person这个类型character(len=30):: name!人名integer :: age!年龄integer :: height!身高INTEGER :: weight!体重character(len=80):: address!地址End type person type(person):: a!声明一个person类型的变量write(*,*)“NAME:” read(*,*)a%name write(*,*)“AGE:” read(*,*)a%age write(*,*)“HEIGHT:” read(*,*)a%height write(*,*)“WEIGHT:” read(*,*)a%weight write(*,*)“ADDRESS:” read(*,*)a%address write(*,100)a%name,a%age,a%height,a%weight 100 format(“Name:”,A10/,“Age:”,I3/,“Height:”,I3/,“Weight:”,I 3/,&“Addres:”,A80)End4.REAL 与 INTEGER Program ex0431 implicit noneinteger :: a=1integer :: b=2real:: cc=a/b!c=1/2=0, 虽然c是浮点数,但因为a,b是整数,计算a/b时会用整数去计算.write(*,“(F5.2)”)c End5.DATA 变量表/初值表/,变量表/初值表/,… PROGRAM ex0430 IMPLICIT NONE INTEGER A REALB COMPLEXC CHARACTER(20)STR DATA A,B,C,STR /1,2.0,(1.0,2.0), 'FORTRAN 77'/ WRITE(*,*)A,B,C,STR END6.复数实虚部Program ex0430 complex :: c =(1,2)write(*,100)real(c),'+',aimag(c),'i' 100 format(f5.1,a1,f5.1,a1)End7.逻辑输出 Program ex0416logical a,ba=.true.b=.false.write(*,100)a,bformat(L5,L4)End8.Program ex0415character(len=20)stringcharacter(len=5)substringstring = “Have a nice day.”substring = “nice”write(*,*)ichar('A')!输出字符A的ASCII码write(*,*)char(65)!输出ASCII码65所代表的字符,也就是Awrite(*,*)len(string)!输出字符串string声明时的长度write(*,*)len_trim(string)!输出字符串string内容的长度write(*,*)index(string, substring)!nice在Have a nice day的第8个位置 End9.Program ex0414character(len= 6)firstcharacter(len=10)secondcharacter(len=20)addfirst=“Happy ”second=“Birthday”add = first//second!经由两个连续的除号可以连接两个字符串write(*,100)addFORMAT('生日快乐',/,A)End10.带精度计算 Program ex0408real(kind=8):: a,ba=1b=0.1write(*,*)a,“+”,b,“=”,a+b End11.逻辑if语句 Program ex0504 implicit noneinteger rain, windspeedlogical r,wwrite(*,*)“Rain:”read(*,*)rainwrite(*,*)“Wind:”read(*,*)windspeedr =(rain>=500)!如果rain>=150, r=.true, 不然r=.false.w =(windspeed>=10)!如果windspeed>=10, w=.true, 不然w=.false.if(r.or.w)then !只要r或w有一个值是true就成立write(*,*)“停止上班上课”elsewrite(*,*)“照常上班上课” End if End12.Select Case用法 Program ex0512 implicit noneinteger :: scorecharacter gradewr ite(*,*)“Score:”read(*,*)scoreselect case(score)case(90:100)grade='A'case(80:89)grade='B'case defaultgrade='?'End selectwrite(*,“('Grade:',A1)”)grade End13.IF GOTO语句PROGRAM ex0514 IMPLICIT NONE REAL heightREAL weightWRITE(*,*)“height:” READ(*,*)heightWRITE(*,*)“weight:” READ(*,*)weightIF(weight > height-100)GOTO 200 100 WRITE(*,*)“Under control.”GOTO 300200WRITE(*,*)“Too fat!” 300 STOP END14.DO WHILE 循环 Program ex0604 implicit noneinteger, parameter :: limit=10integer counterinteger :: ans = 0counter = 2do while(counter <= limit)ans = ans + countercounter = counter + 2end dowrite(*,*)ans END15.CYCLE,EXIT 语句 Program ex0609 implicit noneinteger :: i,jloop1: do i=1,3loop2: do j=1,3if(i==3)exit loop1!跳离loop1循环if(j==2)cycle loop2!重做loop2循环write(*, “('(',i2,',',i2,')')”)i, jend do loop2end do loop1 End16.大小写字符 Program ex0612 implicit noneinteger iinteger strlencharacter(len=20):: stringwrite(*,*)“String:”read(*,*)stringstrlen = LEN_TRIM(string)do i = 1, strlenstring(i:i)= char(ichar(string(i:i))+32)end dowrite(*,“('encoded:',A20)”)string End17.循环计算 Program ex0614 implicit nonereal a,b,anscharacter :: key = 'y'!为了至少循环一次do while(key=='y'.or.key=='Y')read(*,*)a read(*,“(A1)”)key read(*,*)b select case(key)case('+')ans = a+b case('-')ans = a-b case('*')ans = a*bcase('/')ans = a/b case defaultwrite(*,“('Unknown operator ',A1)”)keystop end selectwrite(*,“(F6.2,A1,F6.2,'=',F6.2)”)a,key,b,answrite(*,*)“(Y/y)to do again.(Other)to exit.” read(*,“(A1)”)key end do End18.矩阵相加 pogram ex implicit noneinteger, parameter :: row = 2integer, parameter :: col = 2integer :: matrixA(row,col)integer :: matrixB(row,col)integer :: matrixC(row,col)integer rinteger cwrite(*,*)“Matrix A”do r=1, rowdo c=1, colwrite(*,“('A(',I1,',',I1,')=')”)r,cread(*,*)matrixA(r,c)end doend dowrite(*,*)“Matrix B”do r=1, rowdo c=1, colwrite(*,“('B(',I1,',',I1,')=')”)r,cread(*,*)matrixB(r,c)end doend dowrite(*,*)“Matrix A+B=”do r=1, rowdo c=1, colmatrixC(r,c)= matrixB(r,c)+matrixA(r,c)write(*,“('(',I1,',',I1,')=',I3)”)r,c,matrixC(r,c)end do end do end pogram ex[ write(*,“(I3,I3,/,I3,I3)”)((mc(i,j), i=1,2),j=1,2)] 19.program eximplicit noneinteger, parameter :: row = 2integer, parameter :: col = 2integer :: a(2,2)=(/ 1,2,3,4 /)!a(1,1)=1, a(2,1)=2, a(1,2)=3, a(2,2)=4integer :: b(4)=(/ 5,6,7,8 /)integer :: c(2)write(*,*)a,2)write(*,*)a(:,1)c = a(:,1)!c(1)=a(1,1), c(2)=a(2,1)write(*,*)c!c(1), c(2)c = a(2,:)!c(1)=a(2,1), c(2)=a(2,2)write(*,*)c!c(1), c(2)write(*,*)c(2:1:-1)!c(2), c(1)c = b(1:4:2)!c(1)=b(1), c(2)=b(3)write(*,*)c!c(1), c(2)End20.FORALL语句 Program ex Implicit none integer :: I,Jinteger, parameter :: size = 5integer :: a(size,size)forall(I=1:size, J=1:size, I>J)a(I,J)=1!上半部分forall(I=1:size, J=1:size, I==J)a(I,J)=2!对角线forall(I=1:size, J=1:size, I!下半部分write(*,“(5(5I5,/))”)a End21.Allocatable Program EX Implicit none integer :: size, error=0integer, parameter :: one_mb=1024*1024 !1MBcharacter, allocatable :: a(:)Dosize=size+one_mb!allocate(a(size), stat=error)if(error/=0)exitwrite(*,“('Allocate ',I10, ' bytes')”)size write(*,“(F10.2,' MB used')”)real(size)/real(one_mb)deallocate(a)End do End22.Function 函数 Program ex implicit nonereal :: a=10real :: b=20real :: addwrite(*,“(f6.2)”)add(a,b)End Function add(a,b)implicit none real :: a,breal :: addadd = a*b End23.SAVE语句 Program ex Implicit nonecall sub()call sub()call sub()End program Subroutine sub()Implicit noneInteger :: count = 1Save count!指定save变量永远活着,不会忘记它的内容Write(*,*)countcount = count+1 End[运行结果:1 2 3 ]24.生成随机数 program ex implicit noneinterface!定义函数的接口function random10(lbound, ubound)implicit none real :: lbound, ubound real :: random10(10)end functionend interfacereal :: a(10)CALL RANDOM_SEED()!系统根据日期和时间随机地提供种子a = random10(1.0, 10.0)write(*,“(10F6.2)”)aend function random10(lbound, ubound)implicit nonereal :: lbound, uboundreal :: lenreal :: random10(10)realtinteger ilen = ubound-lbound!计算范围大小do i=1,10call random_number(t)!t会是0~1之间的随机数random10(i)= lbound + len * t!把t转换成lbound~ubound 间的随机数end do End25.MODULE语句 Module globalimplicit noneinteger a,bcommon a,b End module Program ex0834use globalimplicit nonea=1b=2call sub()End program Subroutine sub()use globalimplicit nonewrite(*,*)a,breturn End subroutine26.写文件到text program ex0902implicit nonecharacter(len=20):: stringopen(unit=10, file=“test.txt”)write(10,“(A20)”)“I LOVE YOU.”!写到文件中rewind(10)read(10,“(A20)”)string!从文件中读出来write(*,“(A20)”)string!写到屏幕上 end27.随机成绩 program gendataimplicit noneinteger studentsinteger irealr(3)write(*,“(4A5)”)“座位”,“语文”,“数学”,“英语”call random_seed()write(*,*)“How many students?”read(*,*)studentsdo i=1,studentscall random_number(r)write(*,“(6I5)”)i,int(r*50+50)end do end program第二篇:Fortran语言复习大纲复习内容提纲1.FORTRAN程序的结构、书写规则FORTRAN程序的构成(主程序和子程序);FORTRAN77源程序的书写格式。

Fortran95基本语法

Fortran95基本语法

Fortran95基本语法字符:Fortran不区分大小写Fortran 格式:自由格式和固定格式。

Fortran程序代码扩展名为:*.For 或*.F的文件就是指固定格式;以*.F90为扩展名的文件,就是自由格式。

à固定格式:规定了程序代码每一行中每个字段的意义。

第7~72个字符,是可以用来编写程序的字段。

每一行的前5个字符只能是空格或数字,数字用来作为“行代码”。

每一行的第6个字符只能是空格或“0”以外的字符。

à自由格式:叹号(!)后面的文本都是注释。

每行可以编写13 2个字符。

行号放在每行程序的最前面。

一行程序代码的最后如果是符号&,代表下一行程序会和这一行连接;如果一行程序代码的开头是符号&,代表它会和上一行程序连接。

Fortran的数据类型à整型(Integer)à浮点数(Real) à复数(Complex) à字符(Character)à逻辑判断(Logical)—True or FalseRemark: Visual Fortran安装好后,默认的安装目录C:\Program Files\Microsoft Visual Studio\DV98\bin下有一个Bitviewer程序可以用来表看各种数据格式实际在内存中的二进制数据。

Fortran的数学表达式()(括号)、**(乘幂)、*(乘法)or /(除法)、+(加法)or –(减法)à优先级(高à低).输入(Write)输出(Print)命令Fortran程序通常以Program描述来开头,Program后面还要接一个自定义的程序名称(这个名称可以完全自定义,不需要和文件名有任何关系)。

Fortran程序最后还要有End描述,表示程序代码写到这一行结束。

Write(*,*)命令:括号中的两个星号都有各自的意义,第一个星号代表输出的位置使用默认值,也就是屏幕,第二个星号则代表不特别设置输出格式。

读有限元Fortran程序笔记

读有限元Fortran程序笔记

读有限元程序笔记1.ALLOCATABLE::COORD(:,:),PROPS(:,:,:) !声明两个可变大小的数组,COORD(:,:)是二维数组,PROPS(:,:,:)是三维数组。

2.Fortran程序行首为C代表改行为注释,不会被编译3.全局变量(common),不同的程序之间,也就是在不同的函数之间或者是主程序跟函数之间,除了可以通过传递参数的方法来共享内存,还可以通过“全局变量”来让不同程序中声明出来的变量使用相同的内存位置。

4.Dimensional维的,viscoplastic塑性的,elastic有弹力的,finite有限的,element元素,program程序。

5.THREE DIMENSIONAL ELASTIC-VISCOPLASTIC FINITE ELEMENT PROGRAM三维弹塑性有限元程序6.Module可以用来封装程序模块,通常是用来把程序中,具备相关功能的函数及变量封装在一起。

程序在开始定义了一个module模块,在模块中定义了MXKKK=50000000,MXGSJ=1000,MXGSJ=1000三个常量(PARAMETER表示常量),并且每个常量都赋了值。

在module模块中定义了NELEM,NPOIN,NPROP,MXDFN,NSTEP,IDEVP,IDDP,LTYPE以及NFIX1,NPL,NVL,NSL,NHL,NTL,IDCVG,NTOTV,NKK以及DTIME,TOLER,SCALE,DSCALE这些全局变量(common表示全局变量),定义了ICM(3,8),CGAUS(2),VSHAP(8,8),DERIV(3,8,8)以及POSGP(3),COPG(3),EJ(3,3),EJACI(3,3),R(8,8)这些维数与大小都确定的全局数组变量,定义了COORD(:,:),PROPS(:,:,:)以及STRSG(:,:,:),DJ(:,:),CARTD(:,:,:,:)以及TRANJ(:,:,:,:),DJRMX(:,:,:)以及DREMX(:,:,:),DJEMX(:,:,:,:)以及CREMX(:,:,:),CJEMX(:,:,:,:)以及MELEM(:,:),MPROP(:),ISSOR(:,:),NNDEX(:)以及MPFIX(:,:),MPSJ(:),MMATP(:),MPIV(:)以及TSTIF(:)以及ADISP(:),TDISP(:),ALOAD(:)以及PSNBR(:,:,:),PSNBJ(:,:)以及PSTNR(:,:,:),PSTNJ(:,:)以及STRSP(:,:),STRSJ(:,:)这些维数确定但是大小不确定的可变大小的数组,ALLOCA TABLE表示可变大小的数组变量。

Fortran课件12

Fortran课件12
8
6. 使用integer(4)定义,整数范围可扩大到-2147483648~ 2147483647;使用complex(8)定义,复数的实部、虚 部都为双精度数。 7. 扩充C字符串功能,如”\a” c代表响铃, ”\t” c 和 ”\v” c 分别代表横竖向制表,其后的“c”不能省。
8. 扩充C字符串功能,如”\a” c代表响铃, ”\t” c 和 ”\v” c 分别代表横竖向制表,其后的“c”不能省。 9. 以下符号可等同使用.LT.与<、.GT.与>、.EQ.与==、 .NE.与/= 、.GE.与>= 、.LE.与<= 。 10. 使用块case实现多路分支 。 select case(int(price)) case(5:10) 11. 可以使用二进制、八进制 write(*,*) ’cheap’ 和十六进制的B、O、Z编 case(11: ) 辑符 以及T等控制编辑符。 write(*,*) ’expensive’
第十二章 Fortran专题
1
一、公用语句
一般推荐使用虚实结合的方式传递数据。但大量的 数据需要传递时,虚实结合速度较慢,此时可开辟共用 区。开辟共用区用common语句。 无名 公用区 程序中只能有 一个无名公用区 有名 主程序 common /c1/ p, q, k, a(6) 公用区 子程序1 common /c1/ f, g, m, a(6) /c2/ r, w(2,3) 子程序2 common /c1/ u, v, n, a(6) /c2/ r, w(2,3) 主程序 common x, y, i, z(3) 子程序 common a, b, j, t(3)
7
三、Fortran90的新特点
1. 所有Fortran77的规定Fortran90均可识别,以扩展名 区分,“.for”代Fortran77,“.f90”代Fortran90。 2. Fortran90的语句行可以是0~132个字符;取消了书写 的列规定;一行可多条语句,之间以分号隔开;关键 字、常量、变量中不留空格。 program sample 3. “!”之后的语句作为注释 !这是一个简单的例子 语句,可放在程序的任何 character name*20 地方,包括其他语句之后。 name='***' write(*,*) 'Hello!',& 4. “&”作为续行符放在需续 name !已使用续行符 行的语句之尾。 write(*,*) 5. 变量等起名可用1~31个字 write(*,*) 'Please feel at',& ' home in Fortran90!' 符,以字母开头,后跟字 end 母、数字、下划线均可。

Fortran77 程序基础

Fortran77 程序基础



关系表达式是最简单的一种逻辑表达式,它的一般形式为: <关系运算量> <关系运算符> <关系运算量> 关系运算量可以是算术量,也可以是字符量。算术量可以是数值型常 量、数值型变量、数值函数,还可以是算术表达式。如:
A+B>3.5 40>=40 40<C COS(B)<=0.5 (M+N)*X==0.0 X-Z.NE.(Y+X) 等价于 等价于 等价于 等价于 等价于 等价于 A+B.GT.3.5 40.GE.40 40.LT.C COS(B).LE.0.5 (M+N)*X.EQ.0.0 X-Z.NE.(Y+X)


表控格式输入、输出 格式输入、输出


格式输入输出控制符
常用控制符 i,f,a 写法: nIw;nfw.d; naw 如: integer year, month, day write(*, "(3i8)") year, month, day 又如: real runoff write (*, "(f9.2)") runoff
(A.GT.B).AND.(A.NE.C) (X.LT.-1.0).OR.(X.GT.1.0) .NOT.((A+C)*D.LE.0.0) (A.GT.B).EQV.(C.LE.D) 等价于(A>B).AND.(A/=C) 等价于(X<-1.0).OR.(X>1.0) 等价于.NOT.((A+C)*D<=0.0) 等价于(A>B).EQV.(C<=D)


逻辑表达式的一般形式为: <逻辑运算量><逻辑运算符><逻辑运算量>[<逻辑运算符><逻辑运算量>„] 同关系表达式不同,一个逻辑表达式中可以包括多个逻辑运算符,例如逻辑 表达式“A.GE.10.0.AND.A+C.GT.B+D.OR..NOT..TRUE.”中包含 了.AND.、.OR.、.NOT.三个逻辑运算符。在逻辑表达式中除了有逻辑运算符 外,还可以有关系运算符和算术运算符。 下面是一些逻辑表达式的例子:

FORTRAN简明教程

FORTRAN简明教程

《FORTRAN》程序设计原理1、程序结构及书写规则一个程序由不同的程序单元组成,每一程序单元均以end结束,一般情况下,主程序的结构为:Program程序单元名说明语句可执行语句……STOPEND子程序的结构为:SUBROUTINE 程序单元名(哑元名表)说明语句可执行语句………RETURNEND以及FUNCTION 程序单元名(哑元名表)说明语句可执行语句………RETURNEND程序单元名由字母和数字组成,各程序单元中的变量独立编译,同名变量相互不影响。

1-5列为行号,可以是1-99999之间的任意数,6列为续行号,可以是任何字符,正文从第8列写到72列。

当第1列为字符C时,此行为注释行。

2、说明语句说明语句分为二类,一类必须放在程序单元的开头,另一类可以放在任何地方。

2.1 变量说明语句这一类说明语句,必须放在程序单元的开头,以表明变量的性质。

若不加以说明,以I-N开头的变量均为整型,其余变量均为实型,称之为I-N规则。

同一变量经下列显式说明语句说明后,I-N规则失效,没有经显式说明的变量,I-N规则仍然有效。

PARAMETER(变量名=const,……)REAL 变量名表INTEGER变量名表CHARACTER变量名表LOGICAL变量名表COMPLEX 变量名表IMPLICIT 变量基本类型(字符名表)DOUBLE PRECISION变量名表DIMENSION变量名表COMMON 变量名表COMMON /公共区名/ 变量名表DATA 变量名表/数值名表/一个变量可由多个语句说明,其中类型说明语句的级别最高,例如:Implicit real (a-c,e) 由a,b,c,e开头的变量均为实型Dimension ax(100) 定义一个100个元系的实型数组Integer bx, ax 重新定义bx, ax为整型变量2.2 格式说明语句这一类语句可以放在程序单元内的任何地方,常用的有:FORMAT(nFw.d, nX, nAw, nIw, ‘…….’, \ ,nEw.d)这里,n是重复使用该格式码的次数,F表示实型,X表示空格,A表示字符,I表示整型,E科学记数法,w是输入/出的宽度,d是小数位数,引号‘’内的内容原样输出,斜线‘\’表示输入/出时换行。

[精华]fortran之open,write,read,inquire,namelist应用

[精华]fortran之open,write,read,inquire,namelist应用

Fortran之open,write,read,inquire,Namelist 使用Fortran之open,write,read,inquire,Namelist 使用1.文件读取的概念:读取:“顺序读取”和“直接读取”。

保存:“文本文件”和“二进制文件”。

二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。

----------------------------------2. 文件的操作:----------------------------------open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。

example:program ex0901impicit noneopen(unit=10, file='hello.txt') ! 打开hello.txt文件, unit 指定文件代码,file指定文件名称。

write(10, *) "hello" !在代码为10的文件中写入hellostopend program ex0901open中有很多参数可以使用,详细如下:OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...',DELIM='...')UNIT='number': number必须是一个正整数,它可以使用变量或是常量来赋值。

number最好避开1,2,5,6。

因为2,6是默认的输出位置,也就是屏幕。

读有限元Fortran程序笔记

读有限元Fortran程序笔记

读有限元程序笔记1.ALLOCATABLE::COORD(:,:),PROPS(:,:,:) !声明两个可变大小的数组,COORD(:,:)是二维数组,PROPS(:,:,:)是三维数组。

2.Fortran程序行首为C代表改行为注释,不会被编译3.全局变量(common),不同的程序之间,也就是在不同的函数之间或者是主程序跟函数之间,除了可以通过传递参数的方法来共享内存,还可以通过“全局变量”来让不同程序中声明出来的变量使用相同的内存位置。

4.Dimensional维的,viscoplastic塑性的,elastic有弹力的,finite有限的,element元素,program程序。

5.THREE DIMENSIONAL ELASTIC-VISCOPLASTIC FINITE ELEMENT PROGRAM三维弹塑性有限元程序6.Module可以用来封装程序模块,通常是用来把程序中,具备相关功能的函数及变量封装在一起。

程序在开始定义了一个module模块,在模块中定义了MXKKK=50000000,MXGSJ=1000,MXGSJ=1000三个常量(PARAMETER表示常量),并且每个常量都赋了值。

在module模块中定义了NELEM,NPOIN,NPROP,MXDFN,NSTEP,IDEVP,IDDP,LTYPE以及NFIX1,NPL,NVL,NSL,NHL,NTL,IDCVG,NTOTV,NKK以及DTIME,TOLER,SCALE,DSCALE这些全局变量(common表示全局变量),定义了ICM(3,8),CGAUS(2),VSHAP(8,8),DERIV(3,8,8)以及POSGP(3),COPG(3),EJ(3,3),EJACI(3,3),R(8,8)这些维数与大小都确定的全局数组变量,定义了COORD(:,:),PROPS(:,:,:)以及STRSG(:,:,:),DJ(:,:),CARTD(:,:,:,:)以及TRANJ(:,:,:,:),DJRMX(:,:,:)以及DREMX(:,:,:),DJEMX(:,:,:,:)以及CREMX(:,:,:),CJEMX(:,:,:,:)以及MELEM(:,:),MPROP(:),ISSOR(:,:),NNDEX(:)以及MPFIX(:,:),MPSJ(:),MMATP(:),MPIV(:)以及TSTIF(:)以及ADISP(:),TDISP(:),ALOAD(:)以及PSNBR(:,:,:),PSNBJ(:,:)以及PSTNR(:,:,:),PSTNJ(:,:)以及STRSP(:,:),STRSJ(:,:)这些维数确定但是大小不确定的可变大小的数组,ALLOCA TABLE表示可变大小的数组变量。

fortran 自学笔记

fortran 自学笔记
INTEGER(NUM=100) REAL UOC(NUM),ISC(NUM),RS(NUM)
Error: An automatic object is invalid in a main program.
!parameter(pi=3.1415927,J=10) parameter(pi=3.1415927,J=10.0) real :: h=1.0/J do i=1,J-1 u(i)=sin(i*pi*h) !正确写法 !注意: real :: h=1/J,这样写也是不行的 !即使 J=10.0 循环依然可以继续
INTEGER AA(22,22)
DO 20 I=1,22 DO 20 J=1,22 20 END 对于字符串: AA(I,J)=I+I*100 WRITE(*,“(22I8)”)((AA(I,J),J=1,22),I=1,3 ) !也可写成 DO20I=1,22 !如果是将AA全部输出22可以是 大于22的任意个整数,输出仍 然是每行22个数据,但是当只 输出AA的一部分,则格式较死,
必须写你需要的数字,原因未知
FORTRAN 90可以用“”来封装字符串 FORTRAN 77只能用单引号来封装字符串 FORTRAN 77:‘’:字符串; “”:引用符
***************************************************************பைடு நூலகம்******
数字型字符<--->数字 字符串数字 character(len=30)::aa real b 数字字符串: character(len=30)::aa real b 带小数点的数据转换: character(len=30)::aa real b

FORTRAN语言第8章(共8章)

FORTRAN语言第8章(共8章)

8.2 函数子程序(外部函数)
语句函数只能用一个语句定义,而且只 能在定义它的程序段中使用。
分析:函数f(X)是用两个表达式定义的,不 能用简单的语句函数来表示。怎么办? FORTRAN提供了一种方法,就是把函数的 计算部份从程序中独立出来,并按一定的格 式编成一个单独的子程序段,称为外部函数 或函数子程序。
2、如果f(x)与f(x1)同号,则用x作为新 的x1,这就舍去了原来的(x1,x)区间。
x2 x
如果f(x1)与f(x2)异号,则它们之间的连线必然交x轴于x点 有x=x2-(x2-x1)*f(x2)/(f(x2)-f(x1)) 3、再根据新的x1,x2,找到与x轴的交点x,重复上述步骤。
LOGICAL S F(X)=X**3-2.0*X**2-7.0*X+4.0 S(A,B)=SIGN(A,B).EQ.A 10 READ(*,*)X1,X2 F1=F(X1) F2=F(X2) IF(S(F1,F2))GOTO 10

一、语句函数的概念 引例:计算W=0.2P(X)+0.3P(Y)+0.5P(Z) 其中P(T)=0.812T3+1.256T2-3.378T+0.689
WRITE(*,*)’请输入X,Y,Z的值:‘
READ(*,*)X,Y,Z
P1= 0.812*X**3+1.256*X**2-3.378*X+0.689 P2= 0.812*Y**3+1.256*Y**2-3.378*Y+0.689
语句函数小结: 在语句函数定义的语句中,也可出现其他的语句 函数引用,但被引用的语句函和须在它前面已定义。 不允许引用自身或在它后面定义的语句函数。 例:S(A, B, C) = (A+B+C) / 2.0

完整版Fortran之COMMON语句

完整版Fortran之COMMON语句

Fortran 之COMMON句FORTRA程序中各程序单位之间的数据交换可以通过虚实结合来实现, 还可以通过建立公用区的方式来完成。

程序中只可能有一个无名公用区;公用区有两种, 一种是无名公用区, 任何一个一种是有名公用区, 一个程序中可以根据需要由程序员开辟任意多个有名公用区。

建立无名和有名公用区都通过COMMON句来进行。

按照结构化程序设计的指导思想, 通常主张通过虚实结合的途径来传送数据而不主张使用公用区。

因为前者使程序有较好的可读性, 而且容易跟踪数据的流向,便于对程序进行调试和维护。

但是虚实结合的传送方式速度较慢, 特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出。

不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多。

所以在很多应用程序中如果各程序单位之间有大量数据需要传送时, 程序员一般仍然采用开辟公用区的方式。

11.2.1 无名公用区开辟无名公用区COMMO8句的一般形式如下:COMMON a1,a2,・其中a1,a2,…允许是普通变量名、数组名和数组说明符(注意:不是数组元素),它们之间用逗号隔开。

例如:在主程序中写: COMMON, XY, I, Z(3)在子程序中写: COMMON, AB, J, T(3)于是,在无名公用区中变量X和A, Y和B, I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元。

占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。

FORTRAh编译程序在编译时为COMMON句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMO8句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元, 也就是说每个程序单位中的COMMOB句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元。

COMMC语句开辟公用区的主要用途就是使不同程序单位的变量之间进行数据传送, 另一种用途是用来节省存储空间。

Fortran语法备忘录(中级)

Fortran语法备忘录(中级)

Fortran语法备忘录(中级)转自:•目录:•【主程序】【语句函数】【内在过程】【内部过程】【外部过程】•◆外部函数◆外部子程序◆EXTERNAL属性和哑过程◆INTENT属性◆OPTIONAL属性◆哑元改名◆关键字变元INTRINSIC属性◆类属过程◆过程接口 INTERFACE◆超载操作符◆自定义操作符◆超载赋值号•【模块】【块数据】【指针】••【主程序】•!-----------------------------------------------------------------------•[PROGRAM [程序名]]•[说明部分]•[可执行部分]•[CONTAINS•内部过程]•END [PROGRAM [程序名]]•!-----------------------------------------------------------------------•【语句函数】 f(x)=x**2+1•【内在过程】 max,abs,sin,char。

•【内部过程】 Contains•与宿主程序共享变量名, 外部过程FUNCTION, SUBROUTINE都可以有自己的内部过程。

•通常没有说明语句。

•没有哑元,无哑实结合。

•使用内部过程的规则:在宿主中不要定义子程序名和函数名的类型,也不能指定它们是有EXTERNAL属性。

宿主中的变量名和数组名等在内部过程中有效,有相同的数值。

但同一名若在内部过程中又进行了类型声明,则此名被视为其过程中的独立变量,无相同的数值。

内部过程中也可引用另一内部过程。

•例:•!-----------------------------------------------------------------------•program internal•real a,b,c•call find•print *,c•contains•subroutine find•read *, a,b•c=sqrt(a**2+b**2)•end subroutine find•end•!-----------------------------------------------------------------------•【外部过程】•过程=函数&子程序•哑元调用方式:传址调用call by adress,即传递4字节的变量的内存地址。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Fortran之COMMON语句
FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,还可以通过建立公用区的方式来完成。

公用区有两种,一种是无名公用区,任何一个程序中只可能有一个无名公用区;一种是有名公用区,一个程序中可以根据需要由程序员开辟任意多个有名公用区。

建立无名和有名公用区都通过COMMON语句来进行。

按照结构化程序设计的指导思想,通常主张通过虚实结合的途径来传送数据而不主张使用公用区。

因为前者使程序有较好的可读性,而且容易跟踪数据的流向,便于对程序进行调试和维护。

但是虚实结合的传送方式速度较慢,特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出。

不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多。

所以在很多应用程序中如果各程序单位之间有大量数据需要传送时,程序员一般仍然采用开辟公用区的方式。

11.2.1 无名公用区
开辟无名公用区COMMON语句的一般形式如下:
COMMON a1,a2,…
其中a1,a2,…允许是普通变量名、数组名和数组说明符(注意:不是数组元素),它们之间用逗号隔开。

例如:
在主程序中写:COMMON X,Y,I,Z(3)
在子程序中写:COMMON A,B,J,T(3)
于是,在无名公用区中变量X和A,Y和B,I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元。

占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。

FORTRAN编译程序在编译时为COMMON语句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMON语句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元,也就是说每个程序单位中的COMMON语句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元。

COMMON语句开辟公用区的主要用途就是使不同程序单位的变量之间
进行数据传送,另一种用途是用来节省存储空间。

下面的例子通过公用区进行交换数据:
PROGRAM MAIN
COMMON Z1,Z2
READ(*,*)A1,A2,A3
CALL QUAD(A1,A2,A3)
WRITE(*,*)Z1,Z2
END
SUBROUTINE QUAD(A,B,C)
COMMON X1,X2
.
.
.
END
或者:
PROGRAM MAIN
COMMON Z1,Z2,A1,A2,A3
READ(*,*)A1,A2,A3
CALL QUAD()
WRITE(*,*)Z1,Z2
END
SUBROUTINE QUAD()
COMMON X1,X2,A,B,C
.
.
.
END
建立无名公用区的规则:
(1)COMMON语句是说明语句,必须出现在所有可执行语句之前。

COMMON 语句中只允许出现变量名、数组名和数组说明符,后者意味着可用COMMON语句说明数组,此数组必然放在公用区中。

(2)由于公用语句中的变量在编译时已被分配在实在的存储单元中,因此在公用语句中不能出现虚拟参数。

同样,在编译时,可调数组的大小不定,无法分配固定的存储单元,因此可调数组名也不能出现在公用语句中。

但是可调数组的维的上、下界变量可以通过COMMON语句传送,当然这些变量就不再允许出现在虚参表中。

例如:
SUBROUTINE SUB(A,B)
COMMON NA,NB
DIMENSION A(NA),B(NB)
.
.
.
但是为了程序清晰起见,通常不提倡采用这种方式,而是希望通过虚实结合来传送与可调数组有关的全部量。

(3)一个程序在运行过程中只有一个无名公用区。

在同一个程序单位中可以出现几个COMMON语句,它们的作用相当于一个。

FORTRAN编译程序按COMMON语句在同一程序单位中出现的先后次序把语句中变量按顺序放在无名公用区的存储单元中。

(4)各程序单位COMMON语句中的变量类型必须按位置一一对应一致才能正确传送数据。

例如:
主程序中有:
COMMON A(5),I
子程序中有:
COMMON B(4),I,P
主程序中A数组元素是实型,使数组元素A(5)和子程序中的整型变量I 共用存储单元,使主程序中的整型变量I和子程序中的实型变量P共用存储单元都是错误的。

(5)在一个程序单位中,分配在公用区中的名字只能在公用语句中出现一次。

(6)各程序单位中,无名公用区中的变量个数可以不一样。

如:
主程序中有:
COMMON X(9),A,B,C,D
子程序中有:
COMMON A(4),X(2)
这是允许的。

(7)不要混淆EQUIVALENCE和COMMON语句,EQUIVALENCE语句是给同一程序单位中的不同变量分配同一个存储单元,而COMMON语句则用于给不同程序单位的变量分配同一存储单元。

因此不允许在同一程序单位中写:
COMMON A,B,C
EQUIVALENCE(A,B)
因为COMMON语句把变量A、B、C分配在公用区的相邻的三个存储单元中,而EQUIVALENCE语句却又把A、B、C分配在同一个存储单元中,这是矛盾的,因
此禁止以上写法。

(8)公用区可以用EQUIVALENCE语句来扩大加长。

例如:
EIMENSION A(4),B(4)
COMMON A,C
EQUIVALENCE(A(3),B(1))
公用语句在无名公用区开辟了连续的五个存储单元,等价语句使A(3)和B (1)共用存储单元因而把B数组带入了无名公用区,使公用区向后扩大了一个存储单元。

这种情况下公用区的存储分配如下图:
A(1)
A(2)
A(3)
A(4)
C
B(1)
B(2)
B(3)
B(4)
公用区可以用这种方式加长。

但是通过COMMON语句和EQUIVALENCE语句的联用,只允许公用区向后延伸,不允许向前延伸。

对于上例,如果把EQUIVALENCE语句改为:EQUIVALENCE(A(1),B(2))则是非法的,它使得公用区出现下图所示的情况:
A(1)
A(2)
A(3)
A(4)
C
B(1)
B(2)
B(3)
B(4)
B并没有在COMMON语句中说明,它是由等价语句带进来的,但B的元素向前越过了公用区的第一个存储单元,这是不允许的。

11.2.2 有名公用区
COMMON语句说明有名公用区的形式如下:
COMMON/n1/a1,a2,…/n2/b1,b2,…,…
其中,n1,n2为公用区名,它们放在两个斜杠之间。

公用区名的取名方法与变量名同。

公用区名可以和本程序单位中的变量同名,但不允许和子程序同名。

a1、a2、…,b1、b2、…代表各公用区中的变量名、数组名或数组说明符。

也可以用两个连续的斜杠来表示无名公用区,例如:
COMMON R,X,Y,Z /C2/ A,B,C
也可以写成:
COMMON //R,X,Y,Z /C2/ A,B,C
或者:
COMMON /C2/ A,B,C //R,X,Y,Z
COMMON语句中的公用区的变量可以“化整为零”,只要它们在有名公用区中的顺序不变,例如以上语句可写成:
COMMON R /C2/ A //X,Y,Z /C2/ B,C
或者写成:
COMMON R /C2/ A
COMMON /C2/ B,//X
COMMON // Y,Z,/C2/ C
但是这种写法可读性差,建议把一个公用区用一条COMMON语句来完成,例如下面的语句使人一目了然。

COMMON R,X,Y,Z
COMMON /C2/ A,B,C
用无名公用区为各程序单位传送不同的变量时,必须使各个程序单位中的公用变量与单一的无名公用区中相应的变量进行对应,程序之间的数据传送显得僵化繁琐。

利用有名公用区避免了无名公用区的敝端,使之做到公用之中有“专用”,只需在各个程序单位中做到同名公用区中数据顺序一一对应就行了。

有名公用区的使用不仅保留了各程序单位之间数据的快速传送,也使程序得到了简化。

说明有名公用区的规则与说明无名公用区的规则基本相同,不同之处是:
(1)各程序单位的同名公用区中,变量不仅在类型上要一一对应一致,而且个数必须相同。

(2)如果有名公用区中出现字符型变量,则要求整个公用区中的变量都具有字符类型。

也就是不允许字符变量与其它变量放在同一个有名公用区中。

相关文档
最新文档