文档库 最新最全的文档下载
当前位置:文档库 › FORTRAN95 语法基础

FORTRAN95 语法基础

FORTRAN95 语法基础
FORTRAN95 语法基础

FORTRAN 95 语法基础

目录:一、应用程序的创建与运行/FORTRAN 95所用的字符/ 变量类型及其声明,常量声明/表达式与运算符

二、输入与输出:表控、有格式

三、选择语句与结构:IF语句、CASE结构

四、DO循环结构

五、数组:数组的声明,数组的引用,数组的算术运算,数组的输入、输出,给数组赋初值,

动态数组,WHERE、FORALL语句

六、子程序:语句函数,内部子程序,调用子程序时的虚实结合:形参为数组、非定界数组、子

程序名、星号,递归子程序,外部子程序,纯子程序,逐元子程序

七、派生数据类型与结构体

八、指针与动态链表

九、文件:存取方式,基本操作语句,各类文件的读写操作

十、接口、模块

十一、公用区、存储关联、数据块子程序

十二、绘图:坐标系、设置图形颜色、创建图形程序/ 常用过程:设置线型、绘一像素点、设置当前位置、绘直线、绘弧线、绘矩形、绘多边形、绘制扇形(圆、椭圆)/ 文字信息的显示

附/录:标准函数与标准子例行程序

一、基础部份

1-1 FORTRAN 95 应用程序的创建与运行

创建或运行FORTRAN 95程序必须在Microsoft Developer Studio平台上进行。尽管程序文本及相关文件的编辑可以在任一文本编辑器上进行,然后再拷到Studio的文档窗口中。但最好还是一开始就进入Studio环境。创建FORTRAN 95 程序的步骤大致如下:

1)启动Microsoft Developer Studio

可以通过不同方式运行dfdev.exe程序以启动Microsoft Developer Studio

[开始] \ Compaq Visual Fortran 6 \ Developer Studio \ dfdev.exe:或

……\CVF66 \https://www.wendangku.net/doc/e73086682.html,\MSDEV98\dfdev.exe

Microsoft Developer Studio的界面如下图所示:

文档窗口

工作空间窗口

输出窗口

工作空间(WorkSpace)对应着windows资源管理器的一个文件夹。

从菜单栏“File”\“New”\ 在弹出的“New”窗口选“WorkSpace”卡,在“Location”栏指定保存工作空间的位置(即工作空间的上一层文件夹);在“WorkSpace Name”栏指定工作空间名称。

建立完工作空间即生成工作空间文件*.dsw

3)建立项目(Project)

项目是工作空间的下一层文件夹,一个项目只能保存一个主程序及其可执行文件(.exe文件)以及相应的若干辅助文件,如外部子程序、数据文件、说明文件等。

从菜单栏“File”\“New”\ 在弹出的“New”窗口选“Project”卡,在列表中选“Fortran Console Application(Fortran 应用程序)”;填写Project Name(项目名称,即文件夹名) 与“Location”(默认为工作空间);选取单选钮“Add to current WorkSpace”(将该项目添加到当前工作空间)

建立完项目即生成项目文件*.dsp

4)编辑程序文本

无论是程序的源文件还是如数据文件或说明文件等相关的文本虽然可以在任一文本编辑器中进行编辑,但最好是在这个Studio平台上编辑。

从菜单栏“File”\“New”\ 在弹出的“New”窗口选“Files”卡。在列表中选“fortran Free Format Source File(Fortran 自由格式源文件)”。钩选“Add to project”;在“File”栏填入文件名;在“Location”栏默认是项目地址。

Fortran 95的源文件扩展名为.f90。

◆若是编辑数据文件或说明文件则可在“New”窗口的“Files”卡的列表中选“Text File”,或者

在“New”窗口选“Other Documents”卡建立其他类型的文档。

5)编译、连接生成可执行文件(.exe文件)

源程序文件编辑完成后要进行编译,此时系统将对源程序进行语法检查,若有错误将在输出栏显示相关信息,此时可按功能键F4还可提供更详细的信息。编译通过后即生成后缀为.obj的目标文件。当本项目所有的程序都通过编译后即可进行连接生成可执行文件(.exe)。进行编译、连接、执行的指令可通过下表所列方法发出:

1-2 FORTRAN 95所用的字符:

FORTRAN 95中使用的英文字母除字符串外,均不区分大小写。

所有名称均须用英文字母起头,后面可跟着总数不超过31个字符的英文字母、数字、下划线。关键字也可以作为变量、数组、函数、程序等实体的名称。

一个命令行允许编写132个字符,可以书写多条语句,各语句间以分号‘;’分隔。长语句可以分行,以‘&’为续行符。前导行的末尾必须有‘&’号,后续行行首可以有‘&’号也可以没有。

‘!’为注释符,可以出现在一行的任意位置。注释符后的所有字符都是注释文本,注释文本可以包括汉字在内的任何字符。

变量未经声明即认为遵从I-N规则,即:以变量名以字母I、J、K、L、M、N开头的均默认为4字节整型变量,其他的为4字节实型变量。下面的隐式声明语句将取消I-N规则:

IMPLICIT NONE

1)隐式声明语句:

IMPLICIT <隐式声明表>

<隐式声明表>=<类型名称>(<字母>{[,|-]<字母>}){,<类型名称>(<字母>{[,|-]<字母>})

<类型名称>=Integer|Real|Logical|Complex|Character

◆圆括号‘(’、‘)’本身为语法成分,方括号对‘[……]’为可选项,花括号对’{……}’为可重复的可选项。

例:implicit real(a,s,i-k),integer(p,q,r),character(c) 定义了以a,s,i,j,k为首字母的变量为单精实型;以p,q,r为首字母的变量为4字节整型;以c为首字母的变量为字符型。

◆隐式声明语句应放在所有声明语句及可执行语句之前。

2)显式声明语句

<变量类型> <变量名>[{,变量名} ]

例: real name1,name2; real*8 res1

声明name1、name2 为单精(4字节)实型变量,res1为双精(8字节)实型变量。

◆显式声明语句的优先级高于隐式声明。

3)整型变量

Integer [(n)|(kind=n)| *n] [::] <变量名表> n—kind值

<变量名表> = <变量>[=<变量值>][{,<变量>[=<变量值>]}]

Kind取值:1,2,4,8,缺省值为4。

◆有双冒号‘::’的声明语句可同时进行赋值,否则不能进行赋值。

例: integer*4::c1, c2, b1=89, b2=75

表:整型变量的存储开销及取值范围

4)实型变量

REAL [(n)|(kind=n)| *n] [::] <变量名表> n—kind值

<变量名表> = <变量>[=<变量值>][{,<变量>[=<变量值>]}]

Kind取值:4,8,缺省值为4。Kind=4为单精度;kind=8为双精度。

表:实型变量的存储开销及取值范围

5) 复型变量

复数虚、实部要用一对圆括号括起来。表示为:(<实部>,<虚部>)。

声明复型变量的语法为:

COMPLEX [(n)|(kind=n) [::] <变量名表> n—kind值

<变量名表> = <变量>[=<变量值>][{,<变量>[=<变量值>]}]

例:complex*4::cox=(38.8745, -8563.98) , ca

6)字符型变量

CHARACTER [(k)|(len=k)| *k] [::] <变量名表> k—字符串长度,默认为1

<变量名表>=<变量名>[*k][= 字符串]

例:character*4 a,b,c*6 定义了a,b两个字符变量的长度为4,C的长度为6

character*4::a,b=’hd7g’,c*6 对变量b进行了赋值。

7)逻辑型变量

LOGICAL [(n)|(kind=n)] [::] <变量名表> n—kind值,可取1,2,4,8,默认为4。

逻辑型变量的取值范围只有.TRUE. 与.FALSE. 两个值。.TRUE. 等价于-1;.FALSE.等价于0。已定义的逻辑变量其默认值为.FALSE.。

1-4 常量的声明: 常量有整型、实型、复型、字符型、逻辑型。常量的类型像变量一样,可以隐式声明或显式声明。

1-4-1 显式声明

<类型>,PARAMETER::<名称>=<表达式> [,<名称> = <表达式>]

例:integer,parameter:: a=2, b=3

logical,parameter:: L1=.True., L2=.false.

1-4-2 隐式声明

PARAMETER <名称>=<表达式>[{,<名称>=<表达式>}]

例:parameter pi = 3.1415926, num=86

1-5 表达式与运算符返回目录

1-5-1 算术表达式与运算符

算术运算符及其优先级

的。其结果也是高级类型及相应的高KIND值的。在赋值时,若左侧变量与右侧表达式的类型不同,则先将表达式值转换为左侧变量的类型,再赋值给左侧的变量。实型数截去小数转换为整型数。

1-5-2 字符表达式与运算符

求子串操作符:(I:j)——截取从第I 个字符到第j个字符的子串。i,j为整型表达式。

连接操作符://

1-5-4 逻辑表达式与运算符

.not.(非,单目) .and.(与).or.(或).xor.(异或).eqv. (相等).neqv.(不等)

返回目录

二、输出与输入语句返回目录

2-1 表控输入输出语句

表控输入:

READ* [, <输入项列表>]

输入项列表中各项以逗号分隔。

输入数据可以逗号或空格分隔,或以回车换行分隔。使用*号可重复输入,如:3*27.8等同于:27.8,27.8,27.8。这种规则适用于任何类型的数据。

表控输出:

PRINT* [, <输出项列表>]

输出的数据之间有一个空格分隔。但字符串前不出现空格。

复型数输出的格式是用一对圆括号将实部与虚部括起来,实、虚部以逗号相隔。其域宽也与KIND 值有关。

2-2 有格式输入输出

2-2-1 FORMA T语句:<语句标号> Format <格式说明表>

格式说明表:(格式编辑符[{,格式编辑符}])

2-2-2 有格式输入:

read <格式语句标号>,<输入表> | read(*,格式语句标号) <输入表> |

read < ‘|”> <格式说明表><‘|”>,<输入表> | read (*,<‘|”> <格式说明表> <‘|”>)<输入表> 2-2-3 有格式输出:

print <格式语句标号>,<输出表> | write(*,格式语句标号) <输出表> |

print<‘|”> <格式说明表> <‘|”>,<输出表> | write(*,<‘|”> <格式说明表> <‘|”>)<输出表> 例:write(*,’(2x, I4,2x,2f12.4)’) N1,R1,R2; read(*,’(3i2)’)I,J,K

表:数据输入输出用的可重复编辑符(数据编辑符)

◆复数有格式输入输出是通过两个实型编辑符实现。输出时首尾没有圆括号,实、虚部间以一空

格分隔。

◆逻辑值输出为T或F。输入多个逻辑值时用逗号分隔,不可用空格分隔。

◆用A编辑符读入字符时,不要加定界符。否则把定界符也认为是要输入的字符。

表:不可重复编辑符(控制编辑符)

三、选择语句与结构返回目录

3-1 IF语句

3-1-1 简单IF语句:

IF(<逻辑表达式>)<执行语句>

3-1-2 块IF语句:

IF(<逻辑表达式>)THEN

[<语句体1>]

[ ELSE

[<语句体2>] ]

END IF

3-1-3 多分支IF语句:

IF(<逻辑表达式1>)THEN

[<语句体1>]

ELSE IF(<逻辑表达式2>)THEN

[<语句体2>]

…………

ELSE IF(<逻辑表达式n>)THEN

[<语句体n>]

ELSE

[<语句体n+1>]

END IF

3-2 CASE 选择结构

SELECT CASE(<测试表达式>)

CASE (<目标值1>)

[<语句体1>]

…………

. CASE (<目标值n>)

[<语句体n>]

[CASE DEFAULT

测试表达式结果与目标值i匹配时就执行该语句体,否则执行DEFAULT下的语句体。在CASE结构中:

<测试表达式> 必须是整型或逻辑型或CHARACTER*1的字符型表达式。

<目标值> 与<测试表达式>类型一致的有限个常量集,元素间以逗号分隔,如(‘A’,‘E’,‘D’);也以是用冒号与上下界给定的范围,如(5:10)。若省略下界则默认为匹配所有小于或等于上界的值;省略上界则匹配所有大于或等于下界的值。若值是字符,则按ASCII顺序给定上下界,如(‘X’:‘d’)。<测试表达式>是逻辑型时不能指定值的范围。

在CASE结构中不能从一个CASE段跳转到另一个CASE段。

在FORTRAN中所有结构均可嵌套使用。但不能从块外分支进入,而可以从块内分支出转到块外。

四、DO循环结构返回目录

4-1 无条件循环结构

[<名称>:] DO

<循环体>

END DO [<名称>]

◆这类循环结构的循环体中应有判断语句,通过EXIT或GOTO语句结束循环。

4-2 计数型DO循环

[<名称>:] DO < 循环控制变量=初值,终值[,步长] >

<循环体>

END DO [<名称>]

◆缺省步长默认为1。

◆<循环体>中可包含EXIT,CYCLE语句。EXIT强迫终止循环,转向END DO后的第一条语句。CYCLE语句结束当前的循环并开始下一次循环。

4-3 条件型DO循环

[<名称>:] DO WHILE (<循环条件>)

<循环体>

END DO [<名称>]

◆<循环条件>只能是关系表达式或逻辑表达式。表达式为真时执行循环,为假时转向END DO后

的第一条语句。

4-4 给DO语句添加标记

在DO语句前可以添加标记或在关键词DO后添加语句标号。即

<标记:> DO ……

……

END DO <标记>

DO <语句标号> ……

…………

<语句标号> ENDDO

例:

ASD:DO I=1,20

…………

END DO ASD

或:

DO 100 I=1,8

…………

100 END DO

五、数组返回目录

5-1 数组的声明:数组须经声明其类型与维数方可使用。

5-1-1 用类型声明语句:

类型声明语句为:<类型声明符>[::]<数组声明表>

<类型声明符>=[*N | (N) ];

<数组声明表> = <数组名>(<维说明表>) [=<数组初值表>]

{,<数组名>(<维说明表>) [=<数组初值表>]}

<维说明表> = [<下界>:]<上界>{,[<下界>:]<上界>}

<数组初值表> = (/值1,值2,……/)

◆N为KIND值,若省略则使用该类型的默认值。

◆若要对数组赋初值,则必须使用‘::’符。

◆维说明表中缺省下界默认为1。若有任一维的下界大于上界则该数组大小为0。

例:real (4) ::A(2,3)=(/2.2, 4.2, 9.5, 8.7, 6.2, 7.9 /)

5-`1-2 用DIMENSION语句声明数组

DIMENSION <数组声明表>

<数组声明表> = <数组名>(<维说明表>) {,<数组名>(<维说明表>)}

<维说明表> = [<下界>:]<上界> [{,[<下界>:]<上界>}]

◆DIMENSION语句中不能有‘::’符号,不能给数组赋初值。

◆用DIMENSION语句声明的数组,其类型可按隐含规则(I-N规则)确定,也可用显式声明其类

型,但显式声明语句应在DIMENSION语句之前。如:

Real (8) NUM,SUM

DIMENSION NUM(2,3),SUM(2:8)

5-1-3 联合使用类型声明语句与DIMENSION属性声明数组

<类型>,DIMENSION (<维说明表>) ::<数组声明表>

<维说明表> = [<下界>:]<上界> [{,[<下界>:]<上界>}]

<数组声明表> = <数组名>[<维说明表>][=<数组初值表>]

{,<数组名>[<维说明表>][=<数组初值表>]}

◆数组声明表中的数组若自带维声明,则按自带声明的维数与上下界,否则按DIMENSION属性

给出的维说明。

例:Integer, demension(2,3):::num=(/1,2,3,10,20,30/) !对数组NUM赋初值real, dimension (3)::A1,A2,A3(3,6)!A1,A2为一维数组,A3为二维数组

integer, dimension(3,4):: A,B ! 声明A,B为二维数组

5-2 数组的引用

1)访问整个数组,用数组名。如

A=3.5 !将3.5赋值给数组A的所有元素。

Print*,‘A= ’,A !显示数组A的全部元素。

2)访问数组元素,须指定下标,或下标范围:

<数组名>(<下标>[{,<下标>}]

Num = A(2,3)+A(1,3)! 将数组元素A23与A13之和赋值给Num

◆下标一般是整型数,若给了实型数则系统自动取整(截断取整)。

3) 访问一组连续的数组元素片段,可给出下标的范围:

<数组名>(<下标>[{,<下标>}]

下界表达式都缺省,则默认为包含该维从下界到上界的全部元素。 如: A (1,1:3)= 6.5 !将6.5赋值给A 11,A 12,A 13

A (2,

:)= 8 !将 8赋值给数组A 的第二行所有元素。 ◆ 上/下界表达式可以是整型或实型,若为实型则表达式自动取整。 4)访问一组或有规则间隔的元素可给出下标的范围及步长::

<数组名>(<下标>[{,<下标>}]

<下标> = <表达式>|[<下界表达式>]:[<上界表达式>][:<步长>]

◆ 缺省步长,默认为1。

◆ 缺省上/下界表达式,取本维的上/下界 。 如: A(1,1:3:2) = 8.2 !将8.2赋值给A 11与A 13。

◆ 下标越界会产生不可预知的错误。为避免发生此类错误,可使用检测函数: UBOUND (<数组名>[,[dim=]<维的序号>]) ! 给出数组相应维的下标上界

LBOUND (<数组名>[,[dim=]<维的序号>]) ! 给出数组相应维的下标下界 ◆ 若缺省维的序号,则给出的一维整型数组依次为各维下标的上/下界。

5-3 数组的算术运算

算术运算符 +、-、×、/ 、** 也适用于数组。其功能是对同形数组的对应元素进行相应运算。 如:对于数组A(m,n)与B(m,n),语句 A = A / B 等同于: do i = 1,m ; do j = 1,n A(i,j) = A(i,j) / B(i,j) enddo ; enddo

5-4 数组的输入 / 输出 1)使用数组名输入 / 输出 read*, A ! 输入A 数组 print*, A !输出A 数组 或 WRITE (*,‘(<格式说明表>)’) A WRITE (*,) A

数组的逻辑结构是数据表,一维数组是一行,多维数组是多层的数据表。而数组在计算机中的存储结构是连续分布的一串存储单元,是一维线性表。数据的存储顺序是以列为主,按列从上到下,从左到右,从第一层到最后层。

使用数组名输入 / 输出就是按数组的存储结构顺序输入/ 输出。第一个元素是第一层表的第一列第一行,第二个元素是第一层表的第一列第二行,……,然后是第二列第一行、第二行……,再后是第二层表的第一列第一行、第二行……,第二列第一行、第二行…………。

例5-3: 矩阵??

??

??????=12111098765432

1A

对READ*,A 语句的输入顺序应是: 1,5,9,2,6,10, 3,7,11 ,4,8,12

用PRINT*,A 语句输出的结果也是: 1,5,9,2,6,10, 3,7,11 ,4,8,12

2)使用DO 循环语句输入/ 输出数组:

使用循环语句输入/输出,可以实现以行为主或以列为主的顺序。下面为用DO 语句输入: DO J = 1,4 DO I =1,3

READ*, A(I,J)

执行时,以列为主输入,顺序为:1,5,9,2,6,10,3,7,11 ,4,8,12 (逗号处回车换行)若要以行为主输入,则上列程序段应改为:

DO I = 1,3

DO J =1,4

READ*, A(I,J)

END DO

END DO

执行时,以行为主的输入,顺序为:1,2,3,4,5,6,7,8,9,10,11,12(逗号处回车换行)输出时,若要保持原矩阵排列的形式,其程序段为:

DO I = 1,3

DO J =1,4

WRITE(*,'(2x,I2,2x,\)') A(I,J)

END DO

WRITE (*,*)

END DO

若要将A转置,则其程序段为:

DO J = 1,4

DO I = 1,3

WRITE(*,'(2x,I2,2X,\))') A(I,J)

END DO

WRITE (*,*)

END DO

3)使用隐DO循环输入/ 输出数组

隐DO循环输入/ 输出的语法格式为:

(<输入/ 输出项>,<循环控制变量>=<初值>,<终值>[,<步长>])

◆输入项可以是数组元素或普通变量;但不能是常数、函数或表达式。但输出项则除了数组元素外还可以是普通变量、常数、函数或表达式。

◆缺省步长默认为1。

如:对前面的A数组,对其输入的语句为:

Read*, ((A(I,J), j = 1,4), i = 1, 3 )

执行时,按行输入数据。与使用DO循环语句输入时不同的是,不是键入一个数据就回车换行,而是可以一行输入多个数据。应输入的全部数据可以一行输入,也可以任意分成多行输入。

若要按列输入数据,则上述语句应改为:

Read*, ((A(I,J), i = 1,3),j = 1, 4 )

输出A矩阵的隐DO循环语句是:

Write (*,"(4(2x,I2,2x))") ((A(i,j),j=1,4),i=1,3)

以下输出其转置矩阵

Write (*,"(3(2x,I2,2x))") ((A(i,j),i=1,3),j=1,4)

5-5 给数组赋初值返回目录数组在未经赋值前其各元素均为0。

1)使用数组名

若对数组所有元素赋以相同的值,可用数组名。如:

real A(1:8)

对于一维数组: <数组名称> = (/<初值表>/)

<初值表>=< 数值项1,数值项2,……>

例:integer ARR1(6)

ARR1 =(/ 1,2,3,4,5,6 /)!对数组arr1赋初值

对于多维数组,须使用标准函数RESHAPE将一维的数据转换为多维的。

例:ijnteger A (3,4)

A=RESHAPE((/1,2,3,4,5,6,7,8,9,10,11,12/),(/3,4/))

运行时,数组A按存储结构顺序读入数据,分配给各元素,结果是:

1 4 7 10

2 5 8 11

3 5 9 12

◆数组构造器也适用于给数组片段赋初值。如对前例的A数组的第二行赋值,可作:

A(2,:)=(/5,6,7,8 / )

则A数组成为:

1 4 7 10

2 2 2 2

3 5 9 12

3)通过DATA语句对数组赋初值

DA TA语句可以对变量、数组、数组片段、数组元素赋初值

其语法格式为:

DA TA <对象表>/ <初值表>/ [{,<对象表>/<初值表>/}]

<初值表> = <值| 重复系数*值>[{,<值| 重复系数*值> }]

◆初值表中的值只能是常量。各个值按数组的存储结构顺序赋给相应元素。

◆对象表中的对象数目应与初值表中初值的数目相等,类型相容。

◆DATA语句可放在程序中END语句前的任意位置。

例:integer B(2,2)

DA TA B/3,4,5,6/ !B11=3,B21=4,B12==5,B22=6

DA TA B/4*12/ !B11=B21=B12==B22=12

Data m,n/25,62/ ! m=25, n=62

例:integer D(3,4)

Data ((D(i,j), i=1,2),j=2,3)/8,7,9,5/ ! D12=8, D22=7, D13=9, D23=5

5-6 动态数组

动态数组的大小在声明时并不指定,在程序运行期间在使用该数组前才指定其大小.。1)动态数组的声明:

<类型>,DIMENSION(:[{,:}]),ALLOCA TABLE::<数组表>

<数组表> = <数组名>[{,数组名}]

<类型>,ALLOCATABLE::<数组表>

<数组表> = <数组名> (:[{,:}])[{<数组名> (:[{,:}])

例:

Real,Dimension(:::),ALLOCATABLE::num !声明num为实型3维数组。

Real,Dimension(:),ALLOCATABLE::sc !声明sc为实型1维数组

动态数组在使用前须用ALLOCATE语句指定维的上下界,以分配存储空间。ALLOCATE 语句的语法格式为:

ALLOCATE(<数组名>(<维说明表>)[{,<数组名>(<维说明表>)}] [,STAT=<状态变量>])

◆当ALLOCATE 语句被成功执行,返回的状态变量值为0,否则为错误号。

◆ALLOCATE 语句中数组的维数须与其声明语句中的维数一致。

◆对动态数组赋初值不能使用DATA语句

例:ALLOCATE(num (5,2,3:6) , sc (2:8))

3) 释放动态数组

动态数组当不再使用时应及时用DEALLOCATE语句释放其存储空间。DEALLOCATE语句的语法格式为:

DEALLOCATE(<数组表> [,STAT=<状态变量>])

◆数组表中的元素必须是前面已声明的动态数组名.

◆动态数组在离开其作用域后,所分配的存储空间自动释放,不须要DEALLOCA TE语句。

◆经释放的动态数组若要重新使用,可以再次以ALLOCATE语句重新分配存储空间并重新赋值。

5-7 WHERE语句返回目录

5-7-1 简单WHERE语句

语法格式:WHERE(<条件>)<数组赋值语句>

功能::对满足条件的数组元素执行赋值语句。

◆条件表达式中的变量必须是数组元素。

例:

integer score(6)

score=(/98,56,34,46,87,69/)

where (score<60) score = 60

print*,score !输出:98 60 60 60 87 69

end

5-7-2 块WHERE语句

语法格式:WHERE(<条件>)

<数组赋值语句1 >

[ ELSEWHERE

<数组赋值语句2 > ]

ENDWHERE

功能:对满足条件的数组元素执行赋值语句1;对不满足条件的数组元素执行赋值语句2。

例:

integer score(6)

score=(/98,56,34,46,87,69/)

where (score)=60)

score = score + 0.8*(100 -score) ! score(i) = score(i) + 0.8*(100-score(i)) elsewhere

score = 60 !score(i) = 60

endwhere

print*,score !输出:99 60 60 60 97 93

5-7-3 多分支WHERE语句

多分支WHERE语句可以对数组元素使用不同的条件进行筛选然后分别赋值语句格式:WHERE(<条件1>)

<数组赋值语句1 >

ELSEWHERE(<条件2>

<数组赋值语句2 >

ELSEWHERE(<条件n>

<数组赋值语句n >

ENDWHERE

◆在多分支WHERE语句中参与运算的数组须是同形的(相同维数,相同上下界)。

例:

integer score(8)

character*6 grade(8)

score=(/98,56,46,87,69,78,85,74/)

where (score<60)

score=60 ;grade='及格'

elsewhere(score<70)

score=score+5 ;grade='中等'

elsewhere(score<80)

score=score+5 ;grade='良好'

elsewhere

grade='优秀'

endwhere

print*,score ! 98 60 60 87 74 83 85 79

print*,grade ! 优秀及格及格优秀中等良好优秀良好

end

5-8 FORALL语句返回目录FORALL是并行处理语句,可用于实现并行运算。它可以对指定下标的所有数组元素进行运算。

5-8-1 简单FORALL语句

语句格式:FORALL(<下标说明> [,<条件>])< 赋值语句>

例:

forall (i=1:n) X(1,i)=2*Y(i)+

Forall (i=1:n,j=1:m, A(i)<100.and.B(j)<50) C(i,j) = A(i)+B(j)

例:已知矩阵A(m,n)求其转置B(n,m) = A T(m,n)

Forall(i=1:n,j=1:m) B(i,j)=A(j,i)

5-8-2 块FORALL语句

语句格式:FORALL(<下标说明> [,<条件>])

< FORALL体>

END FORALL

功能:对指定下标并符合条件的数组元素依次逐条执行FORALL体的语句,只有在所有符合条件的元素都执行完一条语句后才能执行下一条语句。

◆FORALL体的语句只能是:数组赋值语句、指针赋值语句、WHERE语句、FORALL语句。所

parameter(m=3,n=4)

integer A(m,n),B(m,n)

forall(i=1:m,j=1:n) A(i,j)=2*(i+3*j-3)

print*,' --- MATRIX A ___'

write(*,"((2x,i3,2x))")((A(i,j),j=1,n),i=1,m)

forall (i=1:m,j=1:n,A(i,j)<10)

A(i,j)=10

WHERE(A/=10) B=A

Endforall

print*,' --- MATRIX C ___'

write (*,"((2x,i3,2x))") ((B(i,j),j=1,n),i=1,m)

end

输出:矩阵A: 2 8 14 20 矩阵B:0 0 14 20

4 10 16 22 0 0 16 22

6 12 18 24 0 12 18 24

六、子程序返回目录

子程序包括函数与子例行程序。由FORTRAN95编译程序提供的子程序称为标准子程序,可直接调用,其中包括130多个标准函数与20多个标准子例行程序。此外,用户可以自行编写语句函数与内部子程序及外部子程序。

函数,无论是标准函数还是内部函数或外部函数,均以作为表达式中的操作数直接调用。

子例行程序的调用则须通过CALL <程序名>([<实参表>])实现。

例:产生一个(0,1)随机数序列,保存于数组A中,其程序如下:

Integer, Parameter:: n=100

Real*4 x, A(n)

Call gettime(ih,min,isec,ms) !本行及下一行调用标准子例行程序,使每次产生的随机数列都不相同

Call seed (ms)

Do i=1,n

Call random(x) !调用标准子例行程序

A(i)=x

End do

End

6-1 语句函数

语句函数是只用一条语句(可以续行)写出该函数的表达式。语句函数使用前要先声明函数的类型,然后再声明函数本身。函数的类型可以由隐含规则确定,也可以通过类型声明语句定义其类型,但必须放在该函数定义语句之前。

声明语句函数的语法格式为:

<函数名>(<形参表>) = <函数表达式>

如:real kun

kun(x,y) = 2*sin(3*x) + cos(y) + 3*x*y

◆各形参用逗号隔开,也可以不设形参但圆括号不能省略。

◆形参不允许为常数、数组、数组元素

◆语句函数名为局部名,只能在定义它的程序单元中调用。

6-2 内部子程序

内部子程序的定义语句必须写在主程序的contains 语句与end 语句之间。

6-2-1 内部函数

定义内部函数的语法格式为:

[<类型>]function <函数名>([形参表))

< 函数体>

end function [<函数名>]

◆形参表中各变量的类型可以隐式声明或在函数体的声明语句部分给予显式声明。

◆函数体包括声明语句部分与执行语句部分。声明语句部分包括对函数返回值类型与形参的类型

以及函数体中所引用的语句函数、变量、数组的声明。在执行语句中可以有RETURN语句,该语句控制返回到调用处。

◆若在function前面没有声明函数的类型,则按隐式规则或在函数体内通过声明语句定义函数的类

型。

◆内部函数名为全局名。它可以被其它内部子程序或外部子程序调用。

6-2-2 内部子例行程序

定义内部子例行程序的语法格式为:

SUBROUTINE <子例行程序名>([<形参表>])

<程序体>

END SUBROUTINE [<子例行程序名>]

◆程序体内可包含的内容与内部函数的函数体类似。

例:program try1

call sub1(z,2.0,3.0)

print*,z

contains

function fun1(x,y)

real x,y,fun1,mul

mul(x,y)=2+x*y

fun1=x+y+mul(x,y)

end function

subroutine sub1(z,i,j)

real i,j

z= fun1(i,j)*5

end subroutine

end

6-3 调用子程序时实参与形参之间的数据传递返回目录子程序在被调用前其形参只是一些符号,没有具体数据。只在调用时才发生实参与形参间的数据传递。这种传递称为形参与实参的结合或简称为“虚实结合”。为实现这种结合要求形参与实参数目相等,类型一致。

虚实结合的方式有两种:传值与传址。

传值是实参将其值赋给形参。在此后子程序执行过程中形参数值的改变不影响实参的数值。

传址是实参将其地址传给形参,使形参与实参共用相同的存储空间。在子程序执行过程中形参的任何改变都立即影响实参。

表:虚实结合的方式

①实参数组的首地址传递给形参数组,使两数组的第一元素相结合,其余元素按存储顺序依次结合。形参数组应≤实参数组中参与结合的元素数目。

②实参数组元素的地址传给形参数组,作为形参数组的首地址。使形参数组的第一元素与实参数组元素相结合,其余元素按存储顺序依次结合。形参数组应≤实参数组中参与结合的元素数目。

③结合时,实参数组或实参数组元素之后的所有元素按存储顺序组成一个长字符串,与形参数组元素组成的长字符串结合。形参数组应≤实参数组中参与结合的元素数目。

④形参使用的非定界数组有三种:可调数组、假定大小数组、假定形状数组。这三种非定界数组只能是形参数组。

integer A(2,1:3)

call sub(A,2,1,3)

write(*,'(3(2x,i4))') ((A(i,j),j=1,3),i=1,2)

contains

subroutine sub(B,m,n1,n2) !形参B为可调数组

integer B(m,n1:n2)

forall(i=1:m,j=n1:n2) B(i,J)=i+j-1

end subroutine

end

◆假定大小数组是指其最后维以*号表示的形参数组。虚实结合时,按实参数组最后维的上、下界

确定。

例:program arr_2

parameter(m=3,n=5) ! m、n 为全局变量

dimension A(m,n)

call sub(A)

write(*,100) ((A(i,j),j=1,n),i=1,m)

100 format(1x,5f5.0)

contains

subroutine sub(B)

dimension B(m,*) !B为假定大小数组

forall(I=1:m,j=1:n) B(i,j)=i+j-1

end subroutine

end

注:假定大小数组不能在输出表中出现,也不能用UBOUND、LBOUND、SIZE函数确定假定大小数组的上、下界或其大小。假定大小数组也可以包含定界的维或可调的维。如:

Subroutine sub(A,B,n)

Dimension A(n,*),B(3,*):…………

其中A的第一维是可调的,因而它同时还是可调数组,B的第一维是定界的。

◆假定形状数组是指用冒号‘:’作为维说明的形参数组。它在虚实结合时由实参数组的维说明确

定其形状。假定形状数组可以出现在输入、输出表中,可以用ubound、lbound 、size函数确定其上下界或大小,不允许包含可调或定界的维。

例:

Program arr_3

real A(3,5)

call sub(A)

write(*,100) ((A(i,j),j=1,5),i=1,3)

100 format(1x,5f5.0)

contains

subroutine sub(B)

real B(:,:) !形参B为假定形状数组,其形状同实参数组A

m1=lbound(B,1); m2=ubound(B,1) ; n1=lbound(B,2) n2=ubound(B,2)

do i=m1,m2

do j=n1,n2

B(i,j)=i+j-1

enddo

enddo

⑤子程序名作形参时,其对应的实参可以是外部子程序(函数或子例行程序)或标准函数。作为实参的外部子程序应使用EXTERNAL声明,标准函数应使用INTRINSIC声明。

例:

program sub_1

intrinsic sin

external prt

real fun, f1

f1=fun(3.1415926/6,sin) ! 标准函数SIN作为实参应在intrinsic语句中声明

print*, 'f1= ',f1 !显示0.5000000

call proc(10,20,prt) ! 外部过程prt作为实参应在external语句中声明

end

function fun(x,fx) ! 形参函数Fx, 调用时与实参sin结合

real x

fun=fx(x)

end function

subroutine proc(x,y,pr) ! 形参子程序pr,调用时与外部子过程prt结合

integer x,y

call pr(x+y) ! 调用子过程prt

end subroutine

subroutine prt(x)

integer x

print*, 'x= ',x !显示x = 30

end subroutine

⑥星号作形参时其对应的实参是带星号的可执行语句标号,其作用是选择返回语句return I,其中I 取1、2、……,对应于形参表中的第I个星号。

例:编辑一个简单的加法或乘法计算器

program culculate

print*, ' 输入操作数x ,y ' ; read (*,*) x ,y

do

print*, '输入运算模式: M=1 加法; M=2 乘法; M=3 退出' ; read (*,*) M

call sub(x ,y ,m ,r ,*100 ,*200 ,*300)

100 print* , x ,'+ ',y, '=' ,r

cycle

200 print* , x , ' * ' , y ,' = ' , r

enddo

300 print* , ' 结束运算'

contains

subroutine sub (a, b, mode , res ,* ,* ,*)

select case (mode)

case (1)

res = a+b ;return 1 ! 返回到调用程序的语句100处

case (2)

res = a*b ;return 2 ! 返回到调用程序的语句200处

case (3)

Fortran95习题答案

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.program main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main

fortran95教程5章

第5章准备数据 从本章开始,我们将赋予语言实质性的语义,也就是规定上章所描述的语言的每一个细节所具有的涵义。这种涵义与其说是我们对于一种语言细节的定义,不如说是算法的要求,要求语言具有足够多的细节,用来表达在算法当中有可能出现的精细情节。 对于任何的问题,站在计算机的角度来看,总是可以把它抽象为如下图所示的结构: 因此要准备通过计算来解决一个问题,首先要作到的是把该问题所涉及到的数据整理好,也就是列出所有的数据,然后根据数据的数学属性进行分类,这个分类的过程就是对数据施加足够的标记的过程,将来把这些数据输入到计算机,计算机将能够依据这些标记,辨识出数据所应该具有的数学属性,从而施加相应的合法数学运算。 所以作为向计算机描述计算问题的FORTRAN语言,它首先要作到的是约定如何给数据施加足够详细的标记。 对这个标记过程的第一个要求是保证准确性,也就是说这个语言的标记系统必须正确地反映真实世界的问题里面,数据所具有的数学属性,因此这个标记系统必然是与数据的数学分类结构保持一致的。 从数学的观点来看,世界上的所有数据,总是可以被表示为整数,实数,复数等等基本的数据种类,因此本章的内容就是讨论: ●FORTRAN语言如何把数据归结为一些基本数据类型; ●然后为了足够详尽地描述每一个数据类型的属性,FORTRAN是如何施加相应的标 记的; ●FORTRAN语言对于这些标记(语法形式)所约定的语义是什么。 然后我们就可以知道,要想用FORTRAN来描述一个问题的算法,并进而以问题算法的FORTRAN语言版本为媒介,通过计算机来得到计算结果,第一个步骤,就是准备好数据的FORTRAN描述。 5.1 数据是什么 在上一章里,据称计算机能够使用语言,而且是非常类似于人类的语言,至少从形式上看很象,这难免会令某些人(特别是看过KUBRICK的影片《2001: A Space Odyssey》的观众们)感到恐惧:) 别怕!且先不讨论FORTRAN作为语言是否具有与人类语言等价的表达能力,至少从自然语言的语义学的角度来看,FORTRAN说出来的话其实是绝对空洞的,因为FORTRAN 语言的全部语义基础就只是数据,而数据对机器而言,只是意味着经过编码的符号。 一台计算机其实是由以下6个部分组成:

《程序设计语言(FORTRAN)》理论课程教学大纲(可打印修改)

《程序设计语言(FORTRAN)》课程教学大纲 课程编号: 总学时数:64(计划内)+16(计划外) 总学分数:4 课程性质:必修课 适用专业:给水排水工程、环境工程、土木工程、工程力学、无机非金属材料工程、应用化学等工科专业。 一、课程的任务和基本要求: FORTRAN语言广泛应用于数值分析、科学计算和工程设计等领域,FORTRAN90/95是FORTRAN语言的最新版本,它是一个功能十分强大且体现现代程序设计语言特征的新型程 序设计语言,在社会上产生了广泛影响,许多高等学校、科研院所和公司企业开始引入和使用FORTRAN90/95语言。《程序设计语言(FORTRAN)》课是计算机基础教学课程体系中一门重要的计算机技术基础课程,是给水排水工程、环境工程、土木工程、工程力学、无机非金属材料工程、应用化学等工科专业(方向)的一门学科基础课和专业必修课。 1、课程任务 通过《程序设计语言(FORTRAN)》课程的学习,使学生了解和掌握计算机程序设计的基本概念、基本知识和基本方法,了解和掌握计算机求解问题的机制和方法,熟练掌握FORTRAN90/95语言基本内容、编程技能和开发环境,能熟练运用FORTRAN90/95语言设计 和编写比较复杂的FORTRAN90/95程序,有效解决本专业中遇到的一些数值计算和数据处理问题,使学生计算机应用能力得到显著提高,为专业应用和发展奠定基础。 2、基本要求 (1) 了解程序设计的基本概念、基本知识和基本方法。 (2) 掌握FORTRAN90/95基本内容,能设计和编写比较复杂的FORTRAN90/95程序。 (3) 掌握FORTRAN90/95开发环境(Developer Studio),提高开发效率。 (4) 能结合本专业实际,熟练使用FORTRAN90/95解决有关数值计算和数据处理问题。 二、基本内容和要求: 1.程序设计概述 (1)程序设计语言。 (2)程序和程序设计。 (3)算法的基本概念和主要特征。 (4)程序设计方法。 通过学习要求学生了解程序设计的基本知识、基本概念、基本方法。掌握计算机求解问题的机制和方法。 2.FORTRAN90/95软件开发环境 (1)FORTRAN语言发展概述和FORTRAN90/95主要特征。 (2)Digital Visual FORTRAN 5.0/Compag Visual FORTRAN 6.6主要特性和系统配置。 (3)Microsoft Developer Studio开发环境和解题过程。 通过学习要求学生了解FORTRAN语言发展历史和FORTRAN90/95主要特征,掌握Microsoft Developer Studio开发环境和解题过程。 3.FORTRAN90/95基础知识 掌握字符集、名称、关键字、程序单元、语句、书写格式、数据类型等基础知识和基本概念。 通过学习要求学生熟练掌握FORTRAN90/95常用语法知识和基本使用规则。

Fortran95 简介-全文版

Fortran95简介-全文版 By陈鲸太FORTRAN的演进 FORTRAN的起源,要追溯到1954年IBM公司的一项计划。由JOHN BACKUS 领导的一个小组,尝试着在IBM 704计算机上面发展一套程序,它可以把使用接近数学语言的文字,翻译成机械语言。这个计划在刚开始并不被大家看好,但他们在1957年交出了成果,也就是第一套FORTRAN编译器,FORTRAN语言也就因此诞生了。FORTRAN语言的执行效率普遍的令各界满意,它证明了这项计划的可行性,也成为第一个被广泛使用的高级语言。FORTRAN的名字来自于英文的FORMULA TRANSLATOR这两个字,而这两个字恰是数学公式翻译器的意思。 旧版的FORTRAN77是在1978年由美国国家标准局(ANSI)所正式公布的,之后改版有1992年提出的FORTRAN90以及1997年的FORTRAN95,本文是为了FORTRAN 95所撰写。 编译器简介 1、VISUAL FORTRAN VISUAL FORTRAN一开始是起源于MICROSOFT的FORTRAN POWERSTATION 4.0,这套工具后来卖给DIGITAL公司来继续发展,下一个版本称为DIGITAL VISUAL FORTRAN 5.0,DIGITAL后来被COMPAQ合并,所以接下来的6.0及6.5版就称为COMPAQ VISUAL FORTRAN。而COMPAQ目前又跟HP合并,也许下一个版本会称为HP VISUAL FORTRAN。 VISUAL FORTRAN被整合在一个叫作MICROSOFT VISUAL STUDIO的图形接口开发环境中,VISUAL STUDIO提供一个统一的使用接口,这个接口包括文书编辑功能,PROJECT的管理、除错工具等等,所以在使用上其实跟上学期的VISUAL C++满类似的,同学们上课用过VISUAL C++,对 VISUAL FORTRAN应该不会陌生。 VISUAL FORTRAN 6.5除了完全支持FORTRAN 95的语法外,扩充功能方面提供完整的WINDOWS程序开发工具,专业版还内含IMSL数值链接库。 另外它还可以和VISUAL C++直接互相连结使用,也就是把FORTRAN和C 语言的程序代码混合编译成同一执行档案。 2、在工作站使用FORTRAN 学校计中工作站也提供FORTRAN COMPILER,使用方式很简单,只需要在存放FORTRAN档案的目录下面输入下面叙述即可:

FORTRAN程序设计复习题及答案

FORTRAN程序设计复习题 一、选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= B) .NOT. (A*B+C) C) A2+B2/(C+D) <= D) (A+B).NOT.A*B.GT.(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/ C) (3/5)*EXP(X+Y)D) EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.D) A.LT.B.LT.C.LT.D D(4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(正确描述:主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77表达式中,合法的是: A) .AND.. B) 10.0 C) D) 提示:A)相当于 .AND.(.NOT.()) D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列C) 第6列D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 提示:子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+"的值是 A) B) 1 C) D) 0 提示:2/4默认等于整型,=》 D (12)FORTRAN表达式"MOD,"的值是 A) B)0.0 C) D) A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符*

Fortran95简介-全文版

Fortran95簡介-全文版 By陳鯨太FORTRAN的演進 FORTRAN的起源,要追溯到1954年IBM公司的一項計畫。由JOHN BACKUS 領導的一個小組,嘗試著在IBM 704電腦上面發展一套程式,它可以把使用接近數學語言的文字,翻譯成機械語言。這個計畫在剛開始並不被大家看好,但他們在1957年交出了成果,也就是第一套FORTRAN編譯器,FORTRAN語言也就因此誕生了。FORTRAN語言的執行效率普遍的令各界滿意,它證明了這項計畫的可行性,也成為第一個被廣泛使用的高階語言。FORTRAN的名字來自於英文的FORMULA TRANSLATOR這兩個字,而這兩個字恰是數學公式翻譯器的意思。 舊版的FORTRAN77是在1978年由美國國家標準局(ANSI)所正式公布的,之後改版有1992年提出的FORTRAN90以及1997年的FORTRAN95,本文是為了FORTRAN 95所撰寫。 編譯器簡介 1、VISUAL FORTRAN VISUAL FORTRAN一開始是起源於MICROSOFT的FORTRAN POWERSTATION 4.0,這套工具後來賣給DIGITAL公司來繼續發展,下一個版本稱為DIGITAL VISUAL FORTRAN 5.0,DIGITAL後來被COMPAQ合併,所以接下來的6.0及6.5版就稱為COMPAQ VISUAL FORTRAN。而COMPAQ目前又跟HP合併,也許下一個版本會稱為HP VISUAL FORTRAN。 VISUAL FORTRAN被整合在一個叫作MICROSOFT VISUAL STUDIO的圖形介面開發環境中,VISUAL STUDIO提供一個統一的使用介面,這個介面包括文書編輯功能,PROJECT的管理、除錯工具等等,所以在使用上其實跟上學期的VISUAL C++滿類似的,同學們上課用過VISUAL C++,對VISUAL FORTRAN應該不會陌生。 VISUAL FORTRAN 6.5除了完全支援FORTRAN 95的語法外,擴充功能方面提供完整的WINDOWS程式開發工具,專業版還內含IMSL數值程式庫。另外它還可以和VISUAL C++直接互相連結使用,也就是把FORTRAN和C語言的程式碼混合編譯成同一執行檔案。 2、在工作站使用FORTRAN 學校計中工作站也提供FORTRAN COMPILER,使用方式很簡單,只需要在存放FORTRAN檔案的目錄下面輸入下面敘述即可: ccsun33 [u8623033/fortran]% f77 filename.for

fortran95教程4章

第2篇. 计算的叙述 算法的每一个步骤,都必须给予确切的定义。对于算法当中所 考虑的每一种情况,每一个有待执行的动作,都必须严格地和 不含混地加以规定。…对于以描述算法作为目的而设计出来 的,采用了形式的定义的程序设计语言,或者说计算机语言, 它的每一个语句都必须有非常确切的意义。 ---- D.E.Knuth[1]《The Art of Computer Programming》 本质上FORTRAN就是一门语言,一门人与计算机赖以进行有效交流的语言,在这个意义上和我们使用的中文,英文等没有本质差别。现在假设要来描述一种大家都陌生的语言,那么总是要分成两个方面来描述,即一方面要描述这门语言的表象和形态,也就是它使用哪些符号,哪些词汇,一般的句式如何,怎样才能完整叙述一个任务之类;另一方面需要说明这门语言的语义,也就是说这门语言是如何用来表达我们需要它表达的意思的。 第4章基本上就是描述FORTRAN作为一种语言的基本形态,也就是书写这种语言的书写规则。 接下来几章则逐步说明如何用FORTRAN来表达我们的要求,或者反过来说,FORTRAN提供了些什么表达方式,以便我们用来向计算机提出合理的任务: ● 表达基本数据; ● 表达数据的结构; ● 完整地描述数据; ● 构造表达式; ● 驱动计算的赋值; ● 计算过程的结构控制; 在整个第二篇,我们将领略到FORTRAN 95是如何能够做到精致地描述计算的,而把一个问题阐述清楚了,就意味着问题已经解决了一大半。

[1]Donald E. Knuth (高纳德),Stanford University的The Art of Computer Programming荣休教授,而The Art of Computer Programming(计算机程序设计技巧)正是他的伟大著作的名称。洋洋七大卷的《The Art of Computer Programming》是当今全世界每一个计算机科学家所膜拜的圣经。1974年在该书刚完成前面很少一部分时,就给他带来了计算机科学家们梦寐以求的图灵奖。 第4章FORTRAN 95语言的形貌 要说明一门语言的形态,必须回答以下问题: ●它使用哪些符号来表达信息? ●它的词汇如何构成? ●它的语句如何构成? ●如何表达一个完整的任务? 具体的对于一门计算机语言,把这几个问题更加明确地转换过来,就是: ●它使用键盘上的哪些符号,各个符号有哪些用途? ●它的词汇如何由键盘字符构成?含有哪些固定的词汇?以及容许自由构成合法词汇 的规则是什么? ●它具有哪些固定的语句格式?以及容许自由构成合法语句的规则是什么? ●我们交待给计算机的任何任务,都必须明确说明任务的开始,执行步骤和完成,因 此一段完整的源代码应该具备什么样的形式?以及应该具备哪些要素? 本章就是要回答这些问题。 4.1 FORTRAN语言所使用的字符 从最抽象的层面来看,人与计算机的交流只是信息的交流,而信息总是需要依靠某种信号来表示,对于人来说,最方便的就是字符。而对于计算机来说,自然就是键盘所能敲出的那些字符(信号),因此下面就是要说明: ●FORTRAN 95能识别键盘上敲出的哪些字符? ●每个字符对于FORTRAN 95来说又意味着什么? 4.1.1 FORTRAN 95所使用的基本字符 按照FORTRAN 95标准的规定,一切FORTRAN 95的实现平台都必须使用下面表4-1所列出来的这个基本的字符集,或者说,这个字符集是所有遵循FORTRAN 95标准的编译

FORTRAN 95 语法速查

FORTRAN 95 语法速查 ----------白云、李学哲、陈国新、贾波编著《FORTRAN95程序设计》读书笔记 目录:一、应用程序的创建与运行/FORTRAN 95所用的字符/ 变量类型及其声明,常量声明/表达式与运算符 二、输入与输出:表控、有格式 三、选择语句与结构:IF语句、CASE结构 四、DO循环结构 五、数组:数组的声明,数组的引用,数组的算术运算,数组的输入、输出,给数组赋初值, 动态数组,WHERE、FORALL语句 六、子程序:语句函数,内部子程序,调用子程序时的虚实结合:形参为数组、非定界数组、子 程序名、星号,递归子程序,外部子程序,纯子程序,逐元子程序 七、派生数据类型与结构体 八、指针与动态链表 九、文件:存取方式,基本操作语句,各类文件的读写操作 十、接口、模块 十一、公用区、存储关联、数据块子程序 十二、绘图:坐标系、设置图形颜色、创建图形程序/ 常用过程:设置线型、绘一像素点、设置当前位置、绘直线、绘弧线、绘矩形、绘多边形、绘制扇形(圆、椭圆)/ 文字信息的显示 附/录:标准函数与标准子例行程序 一、基础部份 1-1 FORTRAN 95 应用程序的创建与运行 创建或运行FORTRAN 95程序必须在Microsoft Developer Studio平台上进行。尽管程序文本及相关文件的编辑可以在任一文本编辑器上进行,然后再拷到Studio的文档窗口中。但最好还是一开始就进入Studio环境。创建FORTRAN 95 程序的步骤大致如下: 1)启动Microsoft Developer Studio 可以通过不同方式运行dfdev.exe程序以启动Microsoft Developer Studio [开始] \ Compaq Visual Fortran 6 \ Developer Studio \ dfdev.exe:或 ……\CVF66 \https://www.wendangku.net/doc/e73086682.html,\MSDEV98\dfdev.exe Microsoft Developer Studio的界面如下图所示: 文档窗口 工作空间窗口 输出窗口

fortran安装

Intel Visual Fortran 2013 sp1 完整版下载及安装教程(windows) 10月16日版:更新支持win8.1、VS2013下载地址 【完整安装包】https://www.wendangku.net/doc/e73086682.html,/akdlm/irc_nas/3651/w_fcompxe_ novsshell_2013_sp1.1.139.exe 【联网安装包】https://www.wendangku.net/doc/e73086682.html,/akdlm/irc_nas/3651/w_fcompxe_ novsshell_online_2013_sp1.1.139.exe 【百度云副本】https://www.wendangku.net/doc/e73086682.html,/s/18E41z 更新内容(翻译自官网,不妥之处恳请指正): 1.Intel? Fortran Compiler 更新至14.0.1 --增加/assume:std_value 编译选项 --增加/Q[a]xMIC-AVX512 编译选项 --增加/Qopt-gather-scatter-unroll=n 编译选项 2.Intel? Math Kernel Library 更新至11.1 Update 1 3.增加对Microsoft Windows 8.1*的支持 4.增加对日语的支持 5.修正问题 --https://www.wendangku.net/doc/e73086682.html,/en-us/articles/intel-composer-xe-2013-compilers-sp1-fixes-list --https://www.wendangku.net/doc/e73086682.html,/en-us/articles/intel-mkl-111-bug-fixes/ 安装说明: 1、下载安装包中的任意一个,前两个为官方地址,第三个为百度云副本(完整安装包) 2、运行w_fcompxe_novsshell_2013_sp1.0.103.exe 3、点击extract,解压安装包,解压完毕程序会自动运行安装向导 4、在第三步(Activation)中选择Choose alternative activation,点击下一步 5、选择Use a license file 6、选择你的授权许可文件(lib文件) 7、继续安装过程 备注: 1、安装Intel Visual Fortran Composer前,请确保已经安装了Microsoft Visual Studio 2010/2012/2013。若使用其他编辑器,需要手动配置编译环境。 Visual Studio官网:https://www.wendangku.net/doc/e73086682.html,/。 微软旗下的DreamPark计划为在校大学生免费提供VS2013Pro版,地址:https://https://www.wendangku.net/doc/e73086682.html, 2、安装过程中没有加以说明的步骤,请直接点击下一步。

fortran课后习题答案

第一章 FORTRAN程序设计基础第15页 1、2 1.简述程序设计的步骤。 “程序设计”:反映了利用计算机解决问题的全过程,通常要经过以下四个基本步骤:(1)分析问题,确定数学模型或方法;(2)设计算法,画出流程图;(3)选择编程工具,编写程序;(4)调试程序,分析输出结果。 2. 什么是算法?它有何特征?如何描述算法? 解决问题的方法和步骤称为算法。 算法的五个特征:(1) 有穷性。 (2) 确定性。 (3) 有效性。 (4) 要有数据输入。(5) 要有结果输出。 算法的描述有许多方法,常用的有:自然语言、一般流程图、N-S图等。 第二章顺序结构程序设计 第29页 1、2、3、4、5、6、7、8、9 1.简述符号常量与变量的区别? 符号常量在程序运行过程中其值不能改变。变量在程序运行过程中其值可以改变。 2. 下列符号中为合法的FORTRAN 90标识符的有哪些? (1) A123B (2) M%10 (3) X_C2 (4) 5YZ (5) X+Y (6) F(X) (7) COS(X) (8) A.2 (9) ‘A’ONE (10) U.S.S.R. (11) min*2 (12) PRINT 3. 下列数据中哪一些是合法的FORTRAN常量? (1) 9,87 (2) .0 (3) 25.82(4) -356231 (5) 3.57*E2 (6) 3.57E2.1 (7) 3.57E+2(8) 3,57E-2 4. 已知A=2,B=3,C=5(REAL);且I=2,J=3(INTEGER),求下列表达式的值: (1) A*B+C 表达式的值: 11 (2) A*(B+C) 表达式的值: 16 (3) B/C*A 表达式的值: 1.2 (4) B/(C*A) 表达式的值: 0.3 (5) A/I/J 表达式的值: 0.33 (6) I/J/A 表达式的值: 0 (7) A*B**I/A**J*2 表达式的值: 4.5 (8) C+(B/A)**3/B*2. 表达式的值: 7.25 (9) A**B**I 表达式的值: 512 5. 将下列数学表达式写成相应的FORTRAN表达式: (1) 1E-2 (2)(-B+SQRT(B*B-4*A*C)/(2*A) (3) 1+X+X*X/2+X**3/2/3 (4) COS(ATAN((A**3+B**3)**(1.0/3)/(C*C+1))) (5) EXP(A*X**2+B*X+C) (6) COS(X*Y/SQRT(X*X+Y*Y))**3 6. 用FORTRAN语句完成下列操作: (1) 将变量I的值增加1。I=I+1 (2) I的立方加上J,并将结果保存到I中。 I=I**3+J (3) 将E和F中大者存储到G中。G=Max(E,F) (4) 将两位自然数N的个位与十位互换,得到一个新的数存储到M中(不考虑个位为0的情况) M=MOD(N,10)*10+N/10 第三章选择结构程序设计第43页 1、2、3、5、6、7、9 1.分析下列程序运行结果 (1) LOGICAL P INTEGER I,I1,I2,I3 P=.FALSE. READ*,I I1=MOD(I,10) I2=MOD(I/10,10) I3=I/100

fortran习题参考答案

工程分析程序设计上机作业(五) 模块化编程 上机目的:掌握内部例程、主程序、外部例程、模块等功能的使用方法。 1、有一个六边形,求其面积。为求面积,作了3条辅助线。如图所示:(提示,三角形面 积 2 a b c s ++ =,a、b、c为三个边长)。要求用内部函 数来计算每个三角形的面积。 =21 program main implicit none real :: A(9)=(/10,30,16,13,21,14,20,36,28/) integer i real s s=area(A(3),A(4),A(7))+area(A(2),A(7),A(8))+ & area(A(1),A(8),A(9))+area(A(5),A(6),A(9)) print*,'The area is',s contains function area(x,y,z) implicit none real x,y,z real p,area p=(x+y+z)/2 area=sqrt(p*(p-x)*(p-y)*(p-z))

end function end 2、编写一个子例程子程序,SUM(S,T,N1,N2)。把整型数N1到N2进行求和,并把求 和的结果放置到S,把整型数N1到N2进行求积,并把求积的结果放置到T。并用这个子程序来计算: y=++++++++++- (1234)(345678)(3*4*5*6)(1*2*3) program main implicit none integer A(8) integer i,b,c,d,e,f,g,m,n,y b=0;d=0;g=1;n=1 do i=1,8 A(i)=i end do call sum(b,c,1,4) call sum(d,e,3,8) call sum(f,g,3,6) call sum(m,n,1,3) y=b+d+g-n print*,'y=(1+2+3+4)+(3+4+5+6+7+8)+(3*4*5*6)-(1*2*3)=',y contains subroutine sum(s,t,N1,N2) integer s,t,N1,N2,i do i=N1,N2 s=s+A(i) t=t*A(i) end do end subroutine end 3、编写函数子程序GDC求两个数的最大公约数。求最大公约数的算法如下:把两个数中 大的那个数作为被除数,两数相除得到一个余数。把余数去除除数得到新一轮的余数。 不断重复这一过程直到余数为0,这时的除数就是两个数的最大公约数。

Fortran 95内在过程

附录B Fortran 95内在过程 FORTRAN 95标准提供了115个内在过程,其中包括109个内在函数和6个内在子例行子程序。很多编译系统还提供额外的内在过程。 按照形式,内在过程分为如下两类:通用过程;专用过程。 所谓通用过程是一个集合名称,通用过程与专用过程是一个集合与其元素的关系。一个通用过程由两个或多个专用过程组成。 在所有的115个内在过程当中,除了如下4个内在函数外,其他都是通用过程:LGE、LGT、LLE和LLT。 专用过程针对具体类型与种别的变量。例如,求一个变量的绝对值的通用过程为ABS(X),而求一个整型变量的绝对值的专用过程为IABS(X),求一个复型变量的绝对值的专用过程为CABS(X),如此等等。所以,每个通用过程属下的专用过程都必定具有相应的类型,种别,甚至维的属性。这些专用过程的名称的主要用途是作为实元来传递,这时就必须使用专用过程名称。注意,在表中注明了少数专用过程不能作为实元。 按照功能,FORTRAN 95的内在过程主要分为如下5类:查询与数字操作函数;转换,置空以及传递函数;计算函数;数组函数;内在子例行程序。 如果从功能的角度来对内在过程分类,那么除了上面的比较具体的5类之外,还可以从内在过程对数组的作用方式的角度,把内在过程分为两大类:逐元过程和变换过程。 所谓逐元过程,就是从数学的观点来看,这些专用过程的计算对象并不是数组,但是可以运用一种自然的方式使得这专用过程能够作用于数组对象,并且得到相同形状的数组结果。也就是使得该过程分别作用于数组的每个元素,把所有的过程结果再集合起来作为结果数组。内在过程当中的大部分都属于逐元过程,包括:转换函数;计算函数(除了REPEA T,TRIM,DOT_PRODUCT,MA TMUL之外);子例行程序MVBITS。其他的所有内在过程就都不是逐元过程了。 所谓变换过程,就是内在过程里面逐元过程之外的所有过程都称为变换过程,因为从它们的定义的实质上看,就是作用于一个数组数据对象,得到一个标量或者数组结果,也就是一个变换的过程,而不是单独地作用于每个元素。因此除了函数NULL之外,所有的变换过程或者是具有一个取数组值的哑元,或者是具有一个取数组值的实元,它们对数组的作用都是某种整体变换作用。例如对于向量的乘积,就不能逐个元素地进行。 内在过程的引用正如一般过程的引用一样,可以使用关键词变量。由于某些内在过程的变量是可选项,因此使用关键词能够省略相应的实元。 常见的关键词哑元名称含义如下: ● DIM:DIM主要用于数组简化函数以及其他一些数组函数,表示在函数的作用对象不是整个数组的情况下,数组的哪个维被过程作用。DIM取值为标量整型值,并且常常是可选变量。 ●KIND:KIND一般用于转换函数,说明转换结果的种别参数。KIND实元必须是一个标量整型初始化表达式,一般是可选的。 ●BACK:BACK作为一个可选的逻辑型变量用来表示逆序过程,即它所出现的内在过程的对于数据对象的反方向操作。例如,如果在内在过程INDEX当中出现了BACK=.TRUE.,那么INDEX的搜索操作就必须与正常方向相反,即从字符串的右端开始。 注意内在函数的非指针哑元都具有INTENT(IN)的属性,而指针哑元则不能改变其关联的实元或目标。

Fortran作业2

FORTRAN第二次实习作业 2014301610307 -D-马莉1 、根据最新个人所得税计算方法,如下面的个税税率表。工资、薪金所得,适用七级超额累进税率,税率为百分之三(3% )至百分之四十五(45% )。3500 元为起征点,即只需要缴纳高于3500 元部分的个税。请根据下表编程,通过给定个人收入,计算其所需邀纳的个税。 program jiaoshui implicit none integer m real n character i 100 print*,'应缴纳所得税是否含税,请回答Y或N:' read*,i print*,'请输入工资所得:' read *,m if(i=='Y')then select case(m) case(0:1500) n=m*3/100-0 case(1501:4500) n=m*10/100-105 case(4501:9000) n=m*20/100-555 case(9001:35000) n=m*25/100-1005 case(35001:55000) n=m*30/100-2775 case(55001:80000) n=m*35/100-5505 case default n=m*45/100-13505 end select elseif(i==’N’)then select case(m)

case(0:1455) n=m*3/100-0 case(1456:4155) n=m*10/100-105 case(4156:7755) n=m*20/100-555 case(7756:27255) n=m*25/100-1005 case(27256:41255) n=m*30/100-2775 case(41256:57505) n=m*35/100-5505 case default n=m*45/100-13505 end select else print*,"输入格式不正确,请重新输入:" goto 100 endif print*,n End 2、编写程序求某天在当年中是第多少天,例如2010 年1 月10 号是2010 年的第10 天。要求分别使用IF 、CASE结构来编写。program tianshu2 implicit none integer M1(12),i,y,m,d,sum,n data M1/31,28,31,30,31,30,31,31,30,31,30,31/ sum=0 100 print *,"请输入日期格式例如:2010 10 23" read 10,y,m,d 10 format(i4,1x,i2,1x,i2) if(m>12.or.d>31)then

Fortran95程序设计课后习题答案(word版方便)

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.p rogram main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

Fortran 95学习笔记

Fortran 95 变量名称的取名策略:变量的名字中可以使用的字符集包括英文的26个字母、0~9这10个数字以及下划线“_”,不过前缀必须是英文字母。变量名称的长度限制随着各家编译器的不同而不同,Fortran 标准规定最少要支持到6个字符,Fortran90则最少要支持到31个字符 Implicit Fortran 标准中有一项不太好的功能,它的变量不一定要经过程序声明才能使用,编译器会根据变量的第一个字母来自东决定这个变量的类型。第一个字母为I、J、K、L、M、N的变量会被视为整数类型,其他的变量则会被当成浮点数来使用。 Implicit命令的功能是用来设置“默认类型”。所谓的默认类型,是指Fortran不经过声明,由第一个字母来决定变量类型。可以经过Implicit描述来决定哪些字母开头的变量会自动使用某种类型 Implicit integer (A,B,C) !A、B、C开头的都被视为整型数 Implicit integer(A-F,I,K) !A到F及I、K开头的变量都视为整型数 Implicit real(M-P) !M到P开头的变量都视为浮点数 Implicit none !关闭默认类型功能,所有变量都要事先声明 常数的声明方法(Parameter) Program ex Implicit none Real ::pi Parameter(pi = 3.14129) Write(*,”(F4.2)”) sin(pi/6) end 在Fortran90里,Parameter可以作为形容词,和变量的声明同时写在一起 Real, parameter ::pi=3.14159 !这里pi前面的冒号不能省,和上面代码不同(上面的可以省略)设置变量的初值 变量内容并不一定要在程序执行时才设置,可以在声明时同时给予初值。在Fortran90偶那个,在设置变量初值时,直接把数值写在声明的变量后面就行了。使用这个方法来设置初值是,不能省略声明中间的那两个冒号(Fortran90) 在fortran77中则要使用Data命令设置初值 Fortran 90 Fortran 77 program ex90 implicit none integer ::a=1 real ::b=2.0 complex ::c=(1.0,2.0) character (len=20) ::str="Hello Acuzio!" write (*,*) a,b,c,str end program ex77 implicit none integer a real b

相关文档
相关文档 最新文档