FORTRAN90第十章 指针与递归
FORTRAN知识点总结

F O R T R A N第2章FORTRAN90基础知识:程序单元的概念:fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。
每个程序只有一个主程序单元。
各单元体的程序体形式上相同。
程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。
语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。
字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。
数据结构:整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回;实型REAL ,小数形式和指数形式;复型COMPLEX (种别类型参数值取实部与虚部中较大者);字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成;逻辑型LOGICAL。
派生数据类型TYPE;数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A);字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。
变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。
第3章基本语句:类型说明语句:类型说明(种别说明),属性说明::变量名表尽量避免把两个实数作相等或不相等的比较。
淘汰隐式说明IMPLICIT NONE种别说明:种别参数即对可移植数据精度和范围进行选择的机制KIND(X) 返回变元X的种别参数值SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。
FORTRAN90指导

FORTRAN90指导辅导资料――*****90 楚红*****90学习指导一、*****90基础知识1.源程序及其构成书写格式:主程序定义语句、结束语句注意:在没有程序名称的时候,程序开头的*****也不要出现。
如果使用了程序名称且在END语句中出现,则END语句中的*****不能省略。
语句行可以是0~132个字符;除赋值语句外,每个语句都要使用关键字开头。
如果希望一行中出现多个语句,语句一定要用分号隔开。
空格不能随便使用,关键字、变量和常量名以及操作符中的空格会使字符失去其原有的含义。
但它们之间一定要加空格。
注释行:以感叹号为标记,或“C”、“*”(*****90中不提倡此用法)续行标记:在句末尾添加续行符,如果将关键字分成两行,则下一行开头也要加续行标记。
如果续行符出现在注释语句中,则失去了续行的功能。
2.*****90字符集1 26个英文字母(大小写字母等价)2 10个阿拉伯数字3 下划线4 21个特殊字符:空格= + - * / (),. ‘ : !“ % ;? $5 其他字符(只可以出现在字符常量、字符串编辑描述符、注释和输入输出记录中)3.基本数据类型1 整型KIND值可以为1、2、4 类型说明关键字:*****KIND值决定数据的范围。
对于整数没有误差。
I=3/2=1;I=1/2=0 *****(KIND=4)::A ******4::A *****(4)::A2 实型KIND值可以为4(单精度7位有效数字)、8(双精度15~17位有效数字)类型说明关键字:REAL小数表示形式、指数表示形式(规格化的指数形式)错误表示形式:E34、.E34、0.14E2.3 8开3次方:8.0**(1.0/3.0)3 复型KIND值为4、8是实数的有序对,将两个实数中间用逗号分隔,然后放在一对括号中类型说明关键字:***** 复数的运算:+、―、*、/4 字符型KIND值为国家语言种类由一对单撇号或一对双撇号之间的字符序列组成。
fortran教程[技巧]
![fortran教程[技巧]](https://img.taocdn.com/s3/m/31be265dce84b9d528ea81c758f5f61fb73628ec.png)
前言FORTRAN90的新特性1、淘汰了所有转移语句,增加了新的控制结构,使程序结构化。
增加了结构块,模块及过程的调用灵活形式。
2、加强数组的算法功能。
提出超载概念与实现方法。
提高了文字处理功能。
3、更接近自然语言与公式演算。
允许在字符数据用选取不同种别。
特别:语句书写对列的要求放宽:一般一行写一条语句(也可也多个语句,用“;”分隔),没有标号区、续行区、正文区的区别。
一行最多为132列,可以在任何列处中断语句,中断处写一个“&”,随后在下一行任意列处继续。
一个语句最长不能超过2640个字符。
语句结尾不可有标号、符号。
注释以“!”开始,可以位于任何位置。
***以下只讨论与FORTRAN77不相同处。
第一章FORTRAN90的基本语句第一节类型说明语句1、变量名全长不得超过31个字符。
2、变量类型定义:INTEGER::X,YREAL::ACOMPLEX::B,C,D3、建议淘汰隐式说明,在程序说明部分一开始就写:IMPLICIT NONE向系统声明不使用隐式说明。
4、可以在变量说明时就置初值。
如:REAL::X=1.1,Y,Z=2.25、种别——决定变量的精度和所占内存单元数。
a.如:REAL(KIND=2)::X 说明变量X为REAL型,种别为2。
KIND是种别说明关键字。
如没有种别说明,则采用系统省缺值。
b.有关函数:KIND(X) 返回X的种别参数。
当X取常数0时,返回省缺种别参数。
如KI ND(0)、KIND(0.0)、KIND(.FALSE.)、KIND('A')分别返回整型、实型、逻辑型、字符型的省缺种别参数。
SELECTED_REAL_KIND(N,M) 返回种别参数,使之满足十进制有效位为N, 值范围在10**(-M)和10**M之间的实数。
SELECTED_INT_KIND(N,M) 与上类似,选择整型类别。
c.常数类别表示对数值型常数、逻辑型常数用后缀法,即在常数后加一下划线,再跟种别参数。
FORTRAN_90_复习

FORTRAN 90 基础知识第三章基本知识,如:字符集、名称、关键字、程序单元、书写格式、数据类型。
名称:①名称只能由英文字母、数字、下划线符“_”和美元符号“$”组成。
②名称第一个字符必须是英文字母。
③名称不能超过31个字符。
合法名称: Number,Max, PrOgRaM, FIND_IT, read, x, a3b7, china, total, x$y$z 。
非法名称:X-Y-Z, 8q, a.5, _wrong,U.S.A., DR.WANG,$abcd,r a t e 。
书写格式:自由格式,固定格式3个通用标志符:注释标志符“!”、语句分隔标志符“;”和续行标志符“&”。
数据类型第四章 内部数据类型常量和变量:语法描述; 精度(kind 值)和取值范围 整型常量:整数(10进制)。
实型常量:实数。
复型常量:复数。
字符型常量:字符串。
逻辑型常量:逻辑值,布尔值。
.true. .false.变量的申明。
表达式算术表达式:算术运算符的优先级和结合规则;操作数的类型转换FORTRAN 90 数据类型内部数据类型派生类型(记录类型)数组类型指针类型 公用区类型类型整数类型 实数类型 复数类型字符类型 逻辑类型运算符 含义 结合顺序 优先级 运算速度 说明 ( ) 最高 ** 乘方 左←右 高 慢 两个**之间不能出现空格 * / 乘 除 左→右 ↑ ↑ 数学符号× ÷为非法字符,用*和/代替 + - 加(二元加) 减(二元减) 左→右 ↓ ↓ + - 正(一元加) 负(一元减) 低 快不同优先级运算符,“先高后低”结合先乘方、后乘除、再加减,括号最优先相同优先级运算符,“从左向右”结合,如9-4+12/3*2**3 = ?乘方算符,“从右向左”结合,如2**3**2 = ?尽量多地使用( ),以使意义明确,避免出现歧义和产生错误转换规则“由低级向高级转换”①数据类型和KIND相同的两个算术操作数,计算时不转换,运算结果的类型和KIND与原数据相同。
Fortran90学习指导

FORTRAN90学习指导一、FORTRAN90基础知识1.源程序及其构成书写格式:主程序定义语句、结束语句注意:在没有程序名称的时候,程序开头的PROGRAM也不要出现。
如果使用了程序名称且在END语句中出现,则END语句中的PROGRAM不能省略。
语句行可以是0~132个字符;除赋值语句外,每个语句都要使用关键字开头。
如果希望一行中出现多个语句,语句一定要用分号隔开。
空格不能随便使用,关键字、变量和常量名以及操作符中的空格会使字符失去其原有的含义。
但它们之间一定要加空格。
注释行:以感叹号为标记,或“C”、“*”(FORTRAN90中不提倡此用法)续行标记:在句末尾添加续行符&,如果将关键字分成两行,则下一行开头也要加续行标记。
如果续行符出现在注释语句中,则失去了续行的功能。
2.FORTRAN90字符集126个英文字母(大小写字母等价)210个阿拉伯数字3下划线421个特殊字符:空格= + - * / (),. ‘ :!“% & ;< > ? $5其他字符(只可以出现在字符常量、字符串编辑描述符、注释和输入输出记录中)3.基本数据类型1 整型KIND值可以为1、2、4类型说明关键字:INTEGERKIND值决定数据的范围。
对于整数没有误差。
I=3/2=1;I=1/2=0INTEGER(KIND=4)::AINTEGER*4::AINTEGER(4)::A2 实型KIND值可以为4(单精度7位有效数字)、8(双精度15~17位有效数字)类型说明关键字:REAL小数表示形式、指数表示形式(规格化的指数形式)错误表示形式:E34、.E34、0.14E2.38开3次方:8.0**(1.0/3.0)3 复型KIND值为4、8是实数的有序对,将两个实数中间用逗号分隔,然后放在一对括号中类型说明关键字:COMPLEX复数的运算:+、—、*、/4 字符型KIND值为国家语言种类由一对单撇号或一对双撇号之间的字符序列组成。
最新FORTRAN90第十章指针与递归

§10.1 指针的概念
指针变量的定义格式:
类型,Pointer[::] 变量名列表
或者分两步定义:
类型 [::] 变量名列表
Pointer 变量名列表 指针变量所指向的变量称为目标变量,简 称为目标。对目标变量的定义必须用target 属性:类型, target[::] 变量名列表 指针变量的类型与它的目标变量的类型 必须一致。
§10.2 指针的使用
§10.2.5 悬空指针与无法访问的内存
没有指向任何对象的指针就是悬空指针。 刚刚定义的指针就是悬空的。用DeAllocate
语句间接释放的指针很可能是悬空的。
悬空指针有不定值,引用悬空指针的结果是随 机的,表现为程序运行不稳定或死机。
不经过内存释放的步骤而将动态变量的指针 直接置空或指向其它目标,就会使该变量所占 的内存不可访问。这会造成内存浪费。
例: Implicit none Type student
integer::num real::score type(student),pointer::next
Print*, p1%num,p1%score Print*, p2%num,p2%score Deallocate(p1) Deallocate(p2) end
§10.3 指针数组
real,pointer::p END type real_pointer Real,target::a,b,c,d,e,f,g,h,x,y TYPE(real_pointer) R(5) Data a,b,c,d,e,f,g,h,x,y/1,2,3,4,5,6,7,8,9,10/ R(1)%p=>b;r(2)%p=>d;r(3)%p=>f r(4)%p=>h;r(5)%p=>y Print *,(R(I)%p,I=1,5),a,c,e,g,x END
编译原理第十章目标程序运行时的存储组织

编译原理第十章目标程序运行时的存储组织课前索引【课前思考】◇回顾通常的编译过程,能否找到本章所讲内容在哪个过程?◇为什么编译程序要考虑目标程序运行时存储区的管理与组织?◇请归纳C语言与PASCAL语言的程序结构与数据类型的不一致点【学习目标】全面熟悉目标程序运行时存储区的整体布局;每种存储区的组织方式与管理方法;并通过实例着重掌握,对同意过程嵌套定义的情况,栈式动态存储分配的组织方式与运行时进栈退栈的活动实现方法。
【学习指南】在代码生成前,编译程序务必进行目标程序运行环境的配置与数据空间的分配。
通常来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码与目标代码运行时的数据空间。
我们这里所说的运行时的存储区组织,是指目标程序运行时的数据空间的管理与组织。
【难重点】◇目标程序运行时,存储区域的整体布局,与各区域的作用。
◇各类不一致类型的数据表示。
◇同意过程嵌套定义的情况,栈式动态分配的组织管理。
◇对过程的调用,进入与退出时,栈式动态分配的工作原理。
◇过程活动纪录的各项内容与它们的作用,与活动纪录的组织方式。
◇过程参数传递的不一致方式。
【知识结构】从逻辑上看,在代码生成前,编译程序务必进行目标程序运行环境的配置与数据空间的分配。
通常来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码与目标代码运行时的数据空间。
数据空间应包含:用户定义的各类类型的数据对象(变量与常数)所需的存储空间,作为保留中间结果与传递参数的临时工作单元,调用过程时所需的连接单元,与组织输入/输出所需的缓冲区。
目标代码所占用空间的大小在编译时能确定。
有些数据对象所占用的空间也能在编译时确定,其地址能够编译进目标代码中。
而有些数据对象具有可变体积与待分配性质,无法在编译时确定存储空间的位置。
因此运行时的存储区常常划分成:目标区、静态数据区、栈区与堆区,如图10.1就是一种典型划分,代码(code)区用以存放目标代码,这是固定长度的,即编译时能确定的;静态数据区(static data)用以存放编译时能确定所占用空间的数据;堆栈区(stack and heap)用于可变数据与管理过程活动的操纵信息。
FORTRAN90指导

FORTRAN90学习指导一、FORTRAN90基础知识1.源程序及其构成书写格式:主程序定义语句、结束语句注意:在没有程序名称的时候,程序开头的PROGRAM也不要出现。
如果使用了程序名称且在END语句中出现,则END语句中的PROGRAM不能省略。
语句行可以是0~132个字符;除赋值语句外,每个语句都要使用关键字开头。
如果希望一行中出现多个语句,语句一定要用分号隔开。
空格不能随便使用,关键字、变量和常量名以及操作符中的空格会使字符失去其原有的含义。
但它们之间一定要加空格。
注释行:以感叹号为标记,或“C”、“*”(FORTRAN90中不提倡此用法)续行标记:在句末尾添加续行符&,如果将关键字分成两行,则下一行开头也要加续行标记。
如果续行符出现在注释语句中,则失去了续行的功能。
2.FORTRAN90字符集126个英文字母(大小写字母等价)210个阿拉伯数字3下划线421个特殊字符:空格= + - * / (), . ‘: !“% & ;< > ? $5其他字符(只可以出现在字符常量、字符串编辑描述符、注释和输入输出记录中)3.基本数据类型1 整型KIND值可以为1、2、4类型说明关键字:INTEGERKIND值决定数据的范围。
对于整数没有误差。
I=3/2=1;I=1/2=0INTEGER(KIND=4)::AINTEGER*4::AINTEGER(4)::A2 实型KIND值可以为4(单精度7位有效数字)、8(双精度15~17位有效数字)类型说明关键字:REAL小数表示形式、指数表示形式(规格化的指数形式)错误表示形式:E34、.E34、0.14E2.38开3次方:8.0**(1.0/3.0)3 复型KIND值为4、8是实数的有序对,将两个实数中间用逗号分隔,然后放在一对括号中类型说明关键字:COMPLEX复数的运算:+、—、*、/4 字符型KIND值为国家语言种类由一对单撇号或一对双撇号之间的字符序列组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
§10.3 指针数组
指针数组是由指针组成的数组。容易与之混 淆的概念是数组指针:指向数组的一个指针。 Real,Dimension(:),Pointer::A !A是数组指针 Dimension B(10),C(8,5) A=>B !A指向一维数组B A=>C(:,4) !A指向二维数组C的第4列
Real,pointer ::p1,p2 Real,target::r1=13 Real,target::r2=15 Print*,r1,r2 P1=>r1;p2=>r2 Print*,p1,p2 P1=p2 Print*,p1,p2,r1,r2 r2=2*r2 P2=>p1 Print*,p1,p2,r1,r2 end
数组指针也可以是动态变量 Real,Dimension(:),Pointer::A !A是数组指针 Allocate(A(50)) !给指针A分配内存
A=10;print *,A DeAllocate(A) !释放指针A的内存
End
§10.3 指针数组
当数组指针是动态变量时,它所分配到的内 存区被当作一个数组使用,但是,该数组是没有 名字的,数组指针的名字就作为它的别名。
称为目标。对目标变量的定义必须用target 属性:类型, target[::] 变量名列表
指针变量的类型与它的目标变量的类型 必须一致。
§10.1 指针的 指针赋值语句: 概念
指针变量=>目标变量 赋值号=>读作“指向”,注意它的写法。 同类型的指针变量可相互赋值 指针变量=>指针变量
指针变量通过指针赋值语句指向目标变量 之后, 使用目标变量和使用它的指针是等同 的。这两者之间的暂时等同关系直到用指 针赋值语句使指针变量指向另外的目标变 量为止。
§10.1 指针的概念
例:Real,pointer ::p1,p2 !p1,p2可指向实 型目标变量。
Real,target::x,y !实型目标变量 P1=>x;p2=>y !指针赋值语句
X=-0.618 ! P1=-0.618
P2=1.414 ! Y=1.414 例:Real,Dimension(:),pointer ::p !p可
说明:
(1)指针变量通过指针赋值语句指向目标变 量之后,便成为所指向目标的别名。
(2)对于一个指针变量的访问,实际上就是 对其目标变量的访问。
(3)可以有多个指针同时指向同一个目标变 量,如:P1=>R,P2=>R 。但不可能一个指 针同时指向多个目标变量。
(4)指针赋值可以改变当前的别名。例如:
例: Implicit none Type student
integer::num real::score type(student),pointer::next
Print*, p1%num,p1%score Print*, p2%num,p2%score Deallocate(p1) Deallocate(p2) end
p2=>p1使p2指向p1所指向的目标。
§10.2 指针的使用
§10.2.1 指针的状态 指针处于三种状态之一:
未定义:程序刚开始时所有指针都未定义 空指针:已定义但没有指向任何目标 关联:指针已定义并指向某一目标
§10.2.2 NULLIFY语句 NULLIFY语句的作用是使指针变量处于
空状态。其格式为: NULLIFY(p) P是指针变量
End Type student
Type(student),pointer::p1,p1
Read*,p1%num,p1%score
Read*,p2%num,p2%score
Nullify(p1%next); Nullify(p2%next)
§10.2 指针的使用
例:Real,Poi§nte1r:0:p.12,p指2 针的使用
Real,Target::a P1=>a;p2=>a !p1,p2都指向a
NULLIFY(p1) !p1为空, p2指向a
P2=>p1 !p1与p2都为空指针
§10.2.3 动态变量 用Allocate分配一块内存,并使指针变量指向它, 指针变量就成了这块内存的别名。这就是动态 变量。 Allocate语句的格式: Allocate(p[,Stat=整型变量名]) P必须已定义,整型变量表明分配是否成功,分配 成功,整型变量被赋值0,否则赋非0值。
§10.2 指针的使用
例:Real,Pointer::p Allocate(p) !给指针p分配内存
用DeAllocate语句可以释放已分配给某指针 变量的内存,并使该指针变量置空。其格式 为:DeAllocate(p[,Stat=整型变量名])
例:Real,Pointer::p Allocate(p) !给指针p分配内存 P=13;print *,p DeAllocate(p) !释放指针p的内存 End
§10.2.4 ASSOCIATED固有函数 逻辑型固有函数ASSOCIATED检查一指针是
否指向一个目标或是否为另一个对象的别名。其 格式为:
ASSOCIATED(p1[,p2])
待检查的指针p1必须已定义;可选参数p2如果 是目标变量,则检查p1是否指向它,p2若是指针, 则检查p1与p2是否指向同一目标或同时为空指 针。 例:Real,Pointer::p,q
INTEGER,PARAMETER::N=6
End do
TYPE(ROW),DIMENSION(N)::S,T
end
DO I=1,N
ALLOCATE(T(I)%R(1:I))
T(I)%R(1:I)=I END DO S=T !相当于 s(I)%r=>t(I)%r Do I=1,n Print*,s(I)%r(1:I) End do
下面的例子说明A不是一个指针数组: Dimension(:),Pointer::A !A是数组指针 Real,target::b=2 Allocate(A(50)) !给指针A分配内存 A(1)=>B !错误,A(1)不是指针
A(2)=64; print *,A(2) DeAllocate(A) !释放指针A的内存
§10.4 链表
链表概念 链表的创建 链表的插入 链表的删除 链表的输出 链表举例
§10.4.1 链表概念
链表是一个节点的序列,其中每个节点被连接 到它前面的节点上。
head
13
27
39
从上面链表可知,每个节点有二个域,第一个是数 据域,第二个是指针域。链表的第一个节点称为表 头,最后一个节点称为表尾。指向表头的指针称为 头指针,最后一个节点的指针域为空指针。没有任 何节点的链表称为空链表。空链表的头指针为空。
指向有target属性的一维实型数组(包括二 维数组的一行或一列)。
Real,target::a(5,6) !实型目标数组 P=>A(2,:) !指针赋值语句 p=1 ! 赋值语句,使A数组第2行元素全为1
例: Real,pointer ::p1,p2 Real,target::r=13 P1=>r P2=>p1 Prinr*,p1,p2,r end
为了表示链表,必须先定义一个派生类型来表 表示节点的结构。例如整型数值链表中节点的 类型定义为:
Type node
integer ::value
type(node),pointer::next
End Type node 表头节点的指针可用下述方法建立:
Type list
type(node),pointer::head
End
§10.3 指针数组
指针数组只能用间接方法实现。 例:定义一个具有5个元素的指针数组。 TYPE real_pointer real,pointer::p END type real_pointer Real,target::a,b,c,d,e,f,g,h,x,y TYPE(real_pointer) R(5) Data a,b,c,d,e,f,g,h,x,y/1,2,3,4,5,6,7,8,9,10/ R(1)%p=>b;r(2)%p=>d;r(3)%p=>f r(4)%p=>h;r(5)%p=>y Print *,(R(I)%p,I=1,5),a,c,e,g,x END
在FORTRAN 90中,严格地由指针组成的指 针数组是不能实现的。
IMPLICIT NONE
Do I=1,n
INTEGER::I
s(I)%r(1:I)=2*i
TYPE ROW
End do
REAL ,DIMENSION(:),POINTER::R
Do I=1,n
END TYPE ROW
Print*,t(I)%r(1:I)
§10 指针与递归
§10.1 指针的概念 §10.2 指针的使用 §10.3 指针数组 §10.4 链表 §10.5 递归及其应用
§10.1 指针的概念
指针变量的定义格式:
类型,Pointer[::] 变量名列表
或者分两步定义:
类型 [::] 变量名列表
Pointer 变量名列表 指针变量所指向的变量称为目标变量,简
…; NULLify(q); !Q是空指针
End if
If(ASSOCIATED(p,q)) then
end
Print*,”p是空指针”
Else
Print*,”p不是空指针”
如果p1,p2指向同一数组的不同部分,它们 被认为是未结合的。 Implicit none Real,target,dimension(4)::a=(/1,2,3,4/) Real,pointer,dimension(:)::p,q P=>a(1:3) Q=>a(2:4) Print*,associated(p,q) end