Fortran数组

合集下载

第9章 FORTRAN中的数组

第9章  FORTRAN中的数组

• •


9.2 数组的引用方式
• 数组经过定义之后,就可以在程序中使用了。在 Fortran77标准中,数组只允许在输入输出语句中 进行整体操作。在其他场合,只能对数组的元素 通过下标索引的方式逐个进行操作。到了 Fortran90标准,这一限制被大大放宽了。数组除 了能够进行整体操作以外,还能对数组中的片断 和数组的整体进行操作。这进一步增强了Fortran 语言在数值处理方面的能力。Fortran中数组的引 用方式可以概括为以下几种:
9.1.3 定义形式三
• 第三种数组定义形式的语法格式如下所示。 • DIMENSION([下标下界:]下标上界[,„]) [::] 数组名[,„] • [类型说明 [::] 数组名[,„]] • 该定义形式通过DIMENSION语句直接说明了数组的 维数和维的范围。这种形式定义的数组全部具有 相同的维数和大小。如下代码表示了如何采用上 述形式进行数组的定义。 • DIMENSION(10, 4:10) :: A, B, N • INTEGER :: A • REAL(8) :: N
9.4 数组的类型
• 根据数组在定义时的特征,比如数组的秩、数组 的形状和每一维的大小,可以将数组划分为好几 种类型。这些不同类型的数组在程序单元中如何 使用?在哪些程序单元中使用?有什么特点?本 节将针对这些问题进行逐一介绍。
9.4.1 显形数组
• 显形(Explicit-shape)数组是Fortran中最简单、 最容易理解的一种数组类型。顾名思义,这种类 型的数组在定义阶段就通过数组定义语句明确的 规定了所有特征,比如数组的秩、数组的维数、 每一维的长度和上下界。通过这种方式定义的数 组具有确定的形状和大小,在程序运行过程中不 允许再对数组的任何特征进行改变。需要注意的 是,在显形数组的维说明中,还允许使用整型变 量或整型表达式来定义维的上下界。这涉及到两 种特殊的显形数组,会在随后的小节中进行介绍。

FORTRAN数组介绍大全

FORTRAN数组介绍大全

数组元素的下标表达式过于复杂时,最好先
行算出,最好不要书写过于复杂的语句和表达
式。 2021/3/26
8
§6.1.4 数组的输入与输出
数组必须先定义后使用,本节讨论中提到的 数组假定已经定义如下:
DIMENSION A(10),M(12),D(5,6)
允许用数组名来I/O整个数组 例: READ(*,*) A,M,D
输出结果为:
1.0 2.0 3.0 4.0 5.0 6.0 1.0 3.0 5.0 2.0 4.0 6.0 1.0 5.0 4.0 3.0
Do I=1பைடு நூலகம்5
do j=1,6
read*,d(I,j)
enddo
Enddo
2021/3/26
10
用DO循环对数组进行输入/输出不方便,为 此,提供了针对I/O的隐含DO循环方式。 例: read(*,*) (A(I),I=4,10,2)
read(*,*) (M(K),K=1,12) WRITE(*,*) ((D(L,N),N=1,6),L=1,5)
用数组名(下标[,下标])指定所要引用的数 组元素。例:a(12),B5(3,6),c3b4(I,J,K)
数组元素的下标可以是算术表达式,系统计 算此表达式的值并自动取整。表达式中所涉 及到的不是常量的量必须要先行算出。
例:a(I+1), b5(b5(3)+a(2))
例:c3b4(I,I+5,c3b4(a(b5(c3b4(1,4,2),6)),3,2))
2021/3/26
7
如果作为数组元素的下标的算术表达式中存 在没有赋值的变量,系统一般自动将它按零处 理,可能会导致计算结果不正确,或者不稳定 (时对时错)。这类错误很难发现,是许多程序 存在bug的原因。

5 Fortran 程序设计5-数组

5 Fortran 程序设计5-数组



数组说明:INTEGER a(L1:U1,L2:U2,…,Ln:Un) 。
逻辑结构: 逻辑结构可看成是由Un-Ln+1个n-1维数组构成,每个n-1维数组又可看成是 由Un-1-Ln-1+1个n-2维数组构成,依次类推,直到每个二维数组又可看成是由 U1-L1+1个一维数组构成。 数组元素的下标a(i,j,k,…,r,s)决定该数组元素在逻辑结构中的位置。
要用DO循环达到和上面同样的效果,需要数组的拷贝: INTEGER :: a(0:9)=(/0,1,2,3,4,5,6,7,8,9/), b(0:9) b=a DO i=1,9 a(i)=b(i-1) END DO
可变大小的数组(动态数组)
数组可以是静态的也可以是动态的。如果数组是静态的,则在编译时 就被分配了固定的储存空间,并且直到程序退出时才被释放。程序运 行时静态数组的大小不能改变。静态数组的缺陷是,即使数组已经使 用完毕,它仍占据着内存空间,浪费了系统资源。在给定的计算机内 存资源情况下,耗费了其他数组可以利用的内存,并且超过资源的数 组将导致程序执行错误。因此,F90增加了动态的数组功能,动态数 组的储存在程序运行当中是可以分配、改变和释放的 动态数组只有两种:可分配数组和自动数组。自动数组和可分配数组 很类似,区别在于当程序开始或结束时,自动数组会自动分配和释放 内存。当用户分配动态存储空间时,数组的大小是在运行时而不是在 编译时确定的。动态分配可以用于标量和任何类型的数组。当用户给 数组指定了可分配属性时并没有立即分配内存,而是直到使用 ALLOCATE语句后才分配。随后还可以用DEALLOCATE语句释放 内存空间,这时数组可以以其它形状或目的来使用
end do
end do

Fortran数组详细介绍

Fortran数组详细介绍

7.5
DATA
给数组赋初值
一、使用DATA语句赋初值 使用DATA语句赋初值 DATA
项目表/常量表/[[,]项目表/常量表/]… 项目表/常量表/[[,]项目表/常量表/]… /[[,]项目表 项目表:变量名、数组名、数组元素名、 项目表:变量名、数组名、数组元素名、 字符子串名和隐DO循环。 DO循环 字符子串名和隐DO循环。 个数、类型、顺序一一对应。 与常量 个数、类型、顺序一一对应。 例: REAL PP(6) COMPLEX*8 LPP INTEGER, DIMENSION(20) :: A DATA PP, LPP/6*0, (8.0, -89)/ DATA(A(I),I=1,20,2)/10*1/, (A(I), I=2, 20, 2)/10*0/
7.3 数组元素的存储结构
例:INTEGER A(10),B(3,4)
A(1) A(2) A(3) A(4) B(1,1) B(2,1) B(3,1) B(1,2) B(2,2) B(3,2)
数组元素 按列存放
B(2,4) A(10) B(3,4)
7.4
数组的输入输出
特点: 特点:每执行一个输入 语句输入一个数组元素 值(一个数组元素值组 成一个输入记录) 成一个输入记录)。 每执行一个输出语句输 出一个数组元素值( 出一个数组元素值(每 一行输出一个数组元素 值 )。
二、以数组名作为输入输出项
数组元素按照在内存中的排列顺序一次全部输入输出。 数组元素按照在内存中的排列顺序一次全部输入输出。 将矩阵存放在数组中并输出。 例:将矩阵存放在数组中并输出。 INTEGER W(3, 3) READ(*,*) W !按列的顺序输入 WRITE(*, 10) W !按列的顺序输出 10 FORMAT(1X, 3I3) 输入: , , , , , , , , 输入:1,4,7,2,5,8,3,6,9 输出: 输出: □□1□□4□□7 □□2□□5□□8 □□3□□6□□9 1 2 3 4 5 6 7 8 9

fortran 模块 数组

fortran 模块 数组

fortran 模块数组Fortran模块是一种用于组织和管理Fortran程序的机制。

在Fortran中,模块可以包含变量、函数和子程序,可以通过使用关键字MODULE和END MODULE来定义。

模块的主要目的是提供一个集中管理代码和数据的方式,以便于程序的复用和维护。

本文将重点介绍Fortran模块中的数组。

在Fortran中,数组是一种用来存储多个相同类型的数据元素的数据结构。

数组可以是一维的,也可以是多维的。

在模块中定义的数组可以在模块中的任何地方使用,并且可以在不同的子程序之间共享。

这使得数组在Fortran程序中非常灵活和强大。

让我们来看一下如何在模块中定义一个一维数组。

假设我们要定义一个长度为N的整数数组,可以使用以下语法:MODULE ArrayModuleINTEGER, DIMENSION(N) :: MyArrayEND MODULE ArrayModule在上面的代码中,我们使用DIMENSION关键字指定了数组的长度为N。

这个数组可以在模块中的任何地方使用。

例如,我们可以在模块中的一个子程序中给数组赋值:SUBROUTINE InitializeArrayUSE ArrayModuleINTEGER :: iDO i = 1, NMyArray(i) = iEND DOEND SUBROUTINE InitializeArray在上面的代码中,我们使用USE语句将模块ArrayModule引入到子程序InitializeArray中,以便可以使用模块中定义的数组。

然后,我们使用一个DO循环为数组赋值。

接下来,让我们来看一下如何在模块中定义一个多维数组。

假设我们要定义一个M行N列的实数数组,可以使用以下语法:MODULE ArrayModuleREAL, DIMENSION(M,N) :: MyArrayEND MODULE ArrayModule在上面的代码中,我们使用DIMENSION关键字指定了数组的维度为M行N列。

fortran数组及其应用

fortran数组及其应用

输入语句中使用隐含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语句给数组赋初值
统计5个数中大于平均值的数据个数
结构简单,但 是用变量和IF 语句较多
变量和IF语句 较少,但程序 结构复杂,需 要输入两遍数 据 使用数组问题 都解决,数据 规模大的话优 势更明显
2.数组声明
数组包括静态数组与动态数组,在程序中使用时,必须进行数 组声明。其一般格式为:

fortran 中integer用法

fortran 中integer用法

fortran 中integer用法在Fortran中,`integer` 是一种用于声明整数变量的数据类型。

以下是`integer` 的一些基本用法:1. 声明整数变量:```fortraninteger :: i ! 声明一个整数变量iinteger :: j, k = 0 ! 声明多个整数变量j和k,并初始化k为0```2. 整数变量赋值:```fortrani = 42 ! 将整数值42赋给变量ij = i + 10 ! 将i加10的结果赋给变量j```3. 整数运算:```fortrank = i * j ! 乘法k = i / j ! 除法k = i + j ! 加法k = i - j ! 减法k = i 2 ! 平方```4. 整数数组:```fortraninteger, dimension(5) :: arr ! 声明包含5个整数元素的数组arrarr = [1, 2, 3, 4, 5] ! 初始化数组元素```5. 整数数组元素访问:```fortranprint *, arr(1) ! 访问数组的第一个元素print *, arr(3) ! 访问数组的第三个元素```6. 循环中使用整数:```fortrando i = 1, 10! 循环体end do```7. 格式化输出:```fortranprint *, "The value of i is:", i```8. 参数声明:```fortransubroutine example(sub_param)integer, intent(in) :: sub_param ! 参数声明! 子程序体end subroutine example```在这里,`intent(in)` 表示`sub_param` 是输入参数,即在子程序中只能读取它的值。

这是一些基本的整数(`integer`) 类型的用法示例。

在实际的Fortran程序中,整数变量和数组经常用于控制循环、索引数组等任务。

fortran 77数组最大范围

fortran 77数组最大范围

Fortran 77是一种编程语言,广泛用于科学和工程计算。

在Fortran 77中,数组是一种非常重要的数据结构,它可以用来存储大量的数据,并进行高效的计算和处理。

然而,由于Fortran 77的一些限制,数组的最大范围受到一定的限制。

本文将对Fortran 77数组的最大范围进行探讨。

1. Fortran 77数组的定义和使用在Fortran 77中,数组是一种能够存储多个相同类型的数据元素的数据结构。

数组的定义方式如下:```fortranREAL A(100)```上面的代码定义了一个包含100个实数型元素的数组A。

数组元素的下标从1开始,所以A(1)表示数组A的第一个元素,A(2)表示数组A 的第二个元素,依此类推。

在Fortran 77中,可以使用数组来进行诸如向量和矩阵运算等各种数学运算。

2. Fortran 77数组的最大范围受限于编译器和硬件Fortran 77的标准没有明确规定数组的最大范围,而其实际的最大范围取决于所使用的编译器和硬件。

一般来说,现代的Fortran 77编译器都支持比较大的数组范围,但仍然存在一些限制。

不同的编译器对数组大小的限制可能有所不同。

一些老旧的或者较为简单的编译器可能对数组大小有比较严格的限制,而一些高级的优化编译器则可以支持更大范围的数组。

硬件的限制也会对数组的最大范围产生影响。

一些32位操作系统和计算机可能对数组的最大范围有限制,而64位操作系统和计算机则可以支持更大范围的数组。

3. 如何确定Fortran 77数组的最大范围要确定Fortran 77数组的最大范围,可以通过查询所使用的编译器的文档或者手册来获取相关信息。

一般来说,编译器的文档中会有对数组大小的限制进行说明,从而可以确定数组的最大范围。

另外,也可以通过简单的试验来确定数组的最大范围。

可以编写一个简单的Fortran 77程序,定义一个非常大的数组,然后尝试进行编译和运行。

如果程序能够成功编译和运行,那么就可以确定数组的最大范围;如果编译或者运行过程中出现错误,那么就说明数组的范围超出了限制。

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

注意以下两种方法的差异: 注意以下两种方法的差异: ① WRITE(*,*) (A(I), I=2, 14, 3) 一次输出A(2)、A(5)、A(8)、A(11)和A(14)的值。 一次输出 、 、 、 和 的值。 的值 ② DO I=2, 14, 3 WRITE(*,*)A(I) 输出5次 输出 次 END DO
DATA语句可以放在END语句之前任何位置。 DATA语句可以放在END语句之前任何位置。在程 语句可以放在END语句之前任何位置 序编译阶段赋初值。 序编译阶段赋初值。
二、使用数组赋值符赋初值
格式:数组名 取值列表 取值列表/) 格式:数组名=(/取值列表 例:INTEGER W(6) W=(/3,0,9,45,34,2/) !用数组名给数组赋值
二、数组元素的引用
,下标 数组名 (下标 [ ,下标 ]…) 允许对数组进行整体操作,例如: 允许对数组进行整体操作,例如: INTEGER , DIMENSION(1:5) :: A A=0, 的全部元素赋为0 A(:)=0 !或写成 A=0,将A的全部元素赋为0 INTEGER , DIMENSION(4,5) :: A A=10, 的全部元素赋为10 A(:,:)=10 !或写成 A=10,将A的全部元素赋为10 再将A 1,3,5列元素赋为 列元素赋为470 A(:,1:5:2)=470 !再将A第1,3,5列元素赋为470 其中1:5:2的含义是从1变化到5 每次增加2 其中1:5:2的含义是从1变化到5,每次增加2。 1:5:2的含义是从 三元表达式的形式是: 初值:终值: 三元表达式的形式是: 初值:终值:步长 其中步长为1 步长可以省略。 其中步长为1时,步长可以省略。
2. 用类型说明语句说明数组 格式: 格式: ,数组说明符 类型符 数组说明符 [ ,数组说明符 ]… 例如: CH(例如:CHARACTER*6 CH(-10:10,5:9)*8 REAL KK(8) REAL(8) A(30) 3. 用DIMENSION语句和类型说明语句同时说明数组 DIMENSION语句和类型说明语句同时说明数组 格式: 格式: 类型符, DIMENSION(维说明符[,维说明 类型符, DIMENSION(维说明符[,维说明 维说明符[, 数组名[,数组名] [,数组名 符]…) :: 数组名[,数组名]…
7.2 数组的说明与引用
一、数组的说明
DIMENSION语句说明数组 1. 用DIMENSION语句说明数组 格式: 数组说明符[,数组说明符] [,数组说明符 格式:DIMENSION 数组说明符[,数组说明符]… 数组说明符:数组名(维说明符[ ,维说明符 维说明符] 数组说明符:数组名(维说明符[ ,维说明符]… ) 维说明符的一般形式是: 维下界:] 维说明符的一般形式是:[维下界:] 维上界 下界为1 下界为1时,可以省略不写,冒号也省略 。 可以省略不写, 整型常量表达式。 维下界和上界都只能是整型常量表达式 维下界和上界都只能是整型常量表达式。维上界 的值必须大于维下界的值。 的值必须素 一、 使用DO循环输入输出数组元素
INTEGER ::I, J REAL:: MAT(2, 3) DO I=1, 3 DO J=1, 2 READ(*,*) MAT(J, I) END DO END DO DO I=1, 2 DO J=1, 3 WRITE(*, 10) MAT(I, J) END DO END DO 10 FORMAT(1X, F6.2) END
7.5
DATA
给数组赋初值
一、使用DATA语句赋初值 使用DATA语句赋初值 DATA
项目表/常量表/[[,]项目表/常量表/]… 项目表/常量表/[[,]项目表/常量表/]… /[[,]项目表 项目表:变量名、数组名、数组元素名、 项目表:变量名、数组名、数组元素名、 字符子串名和隐DO循环。 DO循环 字符子串名和隐DO循环。 个数、类型、顺序一一对应。 与常量 个数、类型、顺序一一对应。 例: REAL PP(6) COMPLEX*8 LPP INTEGER, DIMENSION(20) :: A DATA PP, LPP/6*0, (8.0, -89)/ DATA(A(I),I=1,20,2)/10*1/, (A(I), I=2, 20, 2)/10*0/
PROGRAM LETTER CHARACTER CH INTEGER::LEN (5) INTEGER COUNT, J
DO J=1,5 LEN(J)=0 END DO DO COUNT=1, 100
输入100个字母, 100个字母 P111 例7.3 输入100个字母, 分别统计元音字母A 分别统计元音字母A、E、I、O、 出现的次数。 U出现的次数。
7.3 数组元素的存储结构
例:INTEGER A(10),B(3,4)
A(1) A(2) A(3) A(4) B(1,1) B(2,1) B(3,1) B(1,2) B(2,2) B(3,2)
数组元素 按列存放
B(2,4) A(10) B(3,4)
7.4
数组的输入输出
特点: 特点:每执行一个输入 语句输入一个数组元素 值(一个数组元素值组 成一个输入记录) 成一个输入记录)。 每执行一个输出语句输 出一个数组元素值( 出一个数组元素值(每 一行输出一个数组元素 值 )。
循环可以多层嵌套。 隐DO循环可以多层嵌套。 循环可以多层嵌套 INTEGER W(3, 3) READ(*,*)W WRITE(*, 10)(( W( I, J ), J=1, 3 ), I=1, 3 ) 10 FORMAT(1X, 3I3) 内循环 外循环 输出: 输出:W(1, 1) W(1, 2) W(1, 3) W(2, 1) W(2, 2) W(2, 3) W(3, 1) W(3, 2) W(3, 3) 通过内外循环 的顺序可控制 输入输出顺序
三、用隐DO循环对数组元素进行输入输出 用隐DO循环对数组元素进行输入输出 DO
既可灵活控制输入输出元素的顺序和个数, 既可灵活控制输入输出元素的顺序和个数, 又能通过执行一次输入输出语句完成。 又能通过执行一次输入输出语句完成。 循环的形式: 输入/输出表 输出表, 隐DO循环的形式: ( 输入 输出表 i=e1, e2 [, e3] ) 循环的形式 例:WRITE(*,*) (3, 4, I=1, 3) 等价于: 等价于:WRITE(*,*) 3, 4, 3, 4, 3, 4 例:WRITE(*,100) ( I, A(I), I=1, 10, 2) 100 FORMAT( 1X, 5( I2, I4 ))
READ(*,*)CH IF (CH=='A'.OR.CH=='a') THEN LEN(1)=LEN(1)+1 ELSE IF(CH=='E'.OR.CH=='e') THEN LEN(2)=LEN(2)+1 ELSE IF(CH=='I'.OR.CH=='i') THEN LEN(3)=LEN(3)+1 ELSE IF(CH=='O'.OR.CH=='o') THEN LEN(4)=LEN(4)+1 ELSE IF(CH=='U'.OR.CH=='u') THEN LEN(5)=LEN(5)+1 END IF
例如: 例如: REAL(8),DIMENSION(0:10) :: A,B,C INTEGER,DIMENSION(4,5) :: D,E 三个双精度型数组A,B,C 各含有11个元素。 A,B,C, 11个元素 三个双精度型数组A,B,C,各含有11个元素。两个 整型数组D,E 各含有20个元素。 D,E, 20个元素 整型数组D,E,各含有20个元素。 例如: 例如: REAL,DIMENSION(0:10) :: A,B(20),C(4,5,3) 说明A A(0:10), B(20), C(4,5,3)。 说明A为A(0:10),而B为B(20),C为C(4,5,3)。 以数组名后面的维说明为准。 以数组名后面的维说明为准。
二、以数组名作为输入输出项
数组元素按照在内存中的排列顺序一次全部输入输出。 数组元素按照在内存中的排列顺序一次全部输入输出。 将矩阵存放在数组中并输出。 例:将矩阵存放在数组中并输出。 INTEGER W(3, 3) READ(*,*) W !按列的顺序输入 WRITE(*, 10) W !按列的顺序输出 10 FORMAT(1X, 3I3) 输入: , , , , , , , , 输入:1,4,7,2,5,8,3,6,9 输出: 输出: □□1□□4□□7 □□2□□5□□8 □□3□□6□□9 1 2 3 4 5 6 7 8 9
9 45 34
2
implicit none P110 例7.2 从键盘输入 integer :: a(10) 10个整数存入一个一维数 10个整数存入一个一维数 integer:: m, n, k, temp 组,然后将数组最大值与 do k =1, 10 第一个元素互换, 第一个元素互换,最小值 read(*,*) a(k) 与最后一个元素互换, 与最后一个元素互换,其 end do 余元素不变。 余元素不变。 m=1; n=1 do k=2, 10 if (a(m)<a(k)) m=k if (a(n)>a(k)) n=k end do temp=a(1); a(1)=a(m); a(m)=temp temp=a(10); a(10)=a(n); a(n)=temp write(*,*) (a(k), k=1, 10) end
注意: 注意: DIMENSION语句在程序单位的可执行语句之前 语句在程序单位的可执行语句之前。 (1) DIMENSION语句在程序单位的可执行语句之前。 (2)用DIMENSION语句说明数组时, (2)用DIMENSION语句说明数组时,需用类型说明语句 语句说明数组时 IMPLICIT语句指明数组的类型 语句指明数组的类型, 或IMPLICIT语句指明数组的类型,否则数组的类型服 规则。 从I-N规则。 JU(20),NAME(例:DIMENSION JU(20),NAME(-10:10,1:2) REAL JU CHARACTER NAME 一维实型数组JU JU, 20个元素 二维字符型数组NAME 个元素。 NAME, 一维实型数组JU,有20个元素。二维字符型数组NAME, 共有42个元素,每个元素的定义长度为1 42个元素 共有42个元素,每个元素的定义长度为1。 INTEGER(A例:IMPLICIT INTEGER(A-C), REAL(I,J) DIMENSION B(3:15), IX(10)
相关文档
最新文档