fortran数组及其应用

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

DIMENSION语句
<DIMENSION语句>→DIMENSION <数组声明表> 用DIMENSION语句声明数组,数组类型由隐含规则确定,即由数组名第一 个字母确定,如: DIMENSION num(3),day(12),ihour(5:7),count(-3:3) 其中整型数组有num和ihour,实型数组有day,count。数组类型可结合类 型声明语句改变,在上述语句前加上(INTERGER day,count),则全为整型 数组。 DIMENSION语句中不允许出现符号“::”,不能给数组赋初值。(结合类 型声明符则可以)如: DIMENSION::num(3)=(/10,20,30/) !此语句非法 INTERGER,DIMENSION(3)::num(/10,20,30/) !此语句合法
一维数组是按照数组逻辑结构次序依次将数组元素分配在连续存储单元 中。
多维数组则是按照逻辑结构以列为主次序依次将数组元素分配在连续的 存储单元中
ห้องสมุดไป่ตู้
5.数组的输入输出
INTERGER a(8) DO i=1,8 READ*,a(i) ENDDO 使用DO循环语句 READ*,(a(i),i=1,8)
使用隐含DO循环子句
输入语句中使用隐含DO循环,循环项可以是数组元素或普通变量,但不 能是常数、函数或表达式,而输出语句中都可以,如: READ*,(x+10,i=1,5) !此句非法 PRINT*,(10,i=1,5) !输出5个10 PRINT*,(ABS(-20),i=1,5) !输出5个20
6.给数组赋初值
FORTRAN 95允许使用数组构造器给数组赋初值。 <数组构造器> →(/<数组初值表>/) <数组初值表> →<初值项>{,<初值项>} <初值项> →<初值> ∣<隐含DO循环> 常见的给一维数组赋初值: INTERGER :: a(3)=(/10,20,30/) INTERGER,DIMENSION(3)::a(/10,20,30/) INTERGER a(3) a=(/10,20,30/)或a=(/(i,i=10,30,10)/) 给二维或多维数组赋初值,需要使用标准函数RESHAPE进行转换,例: INTERGER A(2,3),B(7) A=RESHAPE((/1,2,3,4,5,6/),(/2,3/)) !将数组构造器描述的一维数组转换为2行3列的二维数组赋予数组A B=(/RESHAPE(A,(/6/)),7/) !将二维数组A转换为有6个元素的一维数组,作为数组构造器中的字表 另外还可通过DATA语句给数组赋初值
数组及其应用
童传佳



1.数组的基本概念 2.数组声明 3.数组元素引用 4.数组的逻辑结构与存储结构 5.数组的输入输出 6.给数组赋初值 7.WHERE语句 8.动态数组
1.数组的基本概念
数组是一个集合,它的元素必须是标量,其标 量元素可以属于任何的固有数据类型,派生数据类 型,甚至是结构,但数组最关键的一个特征是: 数组的所有标量元素必须属于同一个数据类型,并 且具有同样的种别参数。 这个特征决定了数组是一种功能强大的数据结 构,因为存在大量的实际问题,需要用同一个计算 过程来处理大规模的同种类型的数据。 数组实际上是一组带下标的变量,例如含有五 个元素的数组A可写为A(1),A(2),A(3),A(4),A(5)。
动态数组占用的内存可以释放掉。
对输入不超过200个数求和
PROGRAM static PARAMETER(max=200) INTEGER A(max),i,n,sum READ*,n READ*,(A(i),i=1,n) sum=0 DO i=1,n sum=sum+A(i) ENDDO print*, “所有数的和为”,sum END PROGRAM dynamic INTEGER,Dimension(:),Allocatable::A INTEGER i,n,sum READ*,n Allocatate(A(n)) READ*,(A(i),i=1,n) sum=0 DO i=1,n sum=sum+A(i) ENDDO print*, “所有数的和为”,sum END
例如:要对数组A中绝对值大于1的元素取倒
数,其余的元素取平方 WHERE(ABS(A)>1.0)
A=1.0/A
ELSEWHERE
A=A**2
END WHERE
8.动态数组
对于静态数组,在编译时就被分配在固定的储存空间,并且直到程序退 出时才被释放,因此数组大小始终不变。其优点是存储分配算法简单, 运行速度快,缺点是存储开销大,存储空间浪费严重。 在求解数组元素个数不确定的问题时,可以使用动态数组。动态数组占 用的内存大小是在程序执行期间按需分配的,满足需要又不浪费。
4.数组的逻辑结构与存储结构
数组有逻辑结构与存储结构两大特征。数组逻辑结构:从用户角度看, 数组是一个与计算机实现无关的抽象的数据表。数组存储结构:从计算 机角度看,数组又是一个与计算机实现存储分配有关的具体的数据表。 两者是一一对应关系。 逻辑结构 存储结构
a(1),a(2),a(3),a(4),a(5),a(6),a(7),a(8),a(9) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(9)
静态数组
动态数组
动态数组的定义方式: 1、类型说明,Dimension(RANK),Allocatable::数组名 2、类型声明,ALLOCATABLE::数组名(RANK) RANK规定了数组的维数, 一个:代表一维,:之间用逗号隔开。不能指定 各维的上下界。

Real , Dimension(:), ALLocatable::A !定义一维动态数组A Real , Allocatable ::B(:,:,:) !定义三维动态数组B Integer,Dimension(:),Allocatable::C(1:5) !非法语句,不能指定上下界 Integer,Allocatable D(:) !非法语句,Allocatable后缺::
7.WHERE语句
WHERE语句是FORTRAN 95专门用于处理数组的语句,也称过滤数组语句。 其功能类似IF语句,有三种格式:逻辑、块、多分支WHERE语句。 逻辑WHERE语句的一般格式为: <逻辑WHERE语句> →WHERE(<条件>)<赋值语句> 块与多分支WHERE语句类似IF语句,格式如下: [构造名:] WHERE(屏蔽表达式1) [块] [ELSEWHERE(屏蔽表达式2) [块] [ELSEWHERE [条件3] [块] END WHERE
统计5个数中大于平均值的数据个数
结构简单,但 是用变量和IF 语句较多
变量和IF语句 较少,但程序 结构复杂,需 要输入两遍数 据 使用数组问题 都解决,数据 规模大的话优 势更明显
2.数组声明
数组包括静态数组与动态数组,在程序中使用时,必须进行数 组声明。其一般格式为:
<数组声明语句>→<类型声明符>[::]<数组声明表> 数组声明表包括了数组名以及维说明表(上、下届及初值)。 例如下面都是合法的数组声明: INTERGER num(-3:3) !说明数组num是一个一维整型数组,有7个元素 REAL tcj(-4:2,3:7) !说明数组tcj是一个二维整型数组,有24个元素 若数组声明中含有符号::(双冒号),则允许在声明中给数组赋 初值,否则不允许。如: INTERGER :: a(3)=(/10,20,30/),b(4) 数组a被赋予初值a(1)=10,a(2)=20,a(3)=30.默认下界为1.数组b未赋初 值,数组初值默认为0,即b(1)=b(2)=b(3)=b(4)=0
动态数组不再使用,应及时通过Deallocate语句释放存储空间,其格式为 <DEALLOCATE语句>→ DEALLOCATE(<数组表>[,STAT=<状态变量>]) DEALLOCATE(A) !释放数组A存储空间
THAT’S ALL THANK YOU!
3.数组元素引用
在程序中常常需要引用数组的某个、某些或全部元素,这时得用到数组元素引用 INTERGER :: a(3)=(/10,20,30/);sum=(a(1)+a(2)+a(3))/3.0 <数组元素引用>→<数组名>[(<数组下标>{,<数组下标>})] 数组元素被引用时,若只给出数组名,不指定数组下标,则引用数组全部元素。 INTERGER a(8),b(8),c(3,4) a=10 !将10赋值于a数组所有8个元素 b=a !将数组a的8个数组元素一次赋值于数组b的8个数组元素 c=20 !将20赋值于c数组所有12个元素 a(3:7:2)=a(8)+10 !第3、5、7个数组元素赋值20,元素间增加步长为2 数组下标可以是整型或实型表达式,若为实型则表达式值将自动取整。3个赋值 语句 “d(0.315*5+1)=25”、“d(2.575)=25”、“d(2)=25”等价 FORTRAN95提供两个内部函数(UBOUND、LBOUND)来检测数组的下标下界和下标上 届,在此不多做赘述!
相关文档
最新文档