Fortran语言基础 - 图文 联系客服

发布时间 : 星期二 文章Fortran语言基础 - 图文更新完毕开始阅读f58fff49fe4733687e21aa93

山东建筑大学

给定初值。

5.2.1 赋初值

数组可以象变量一样使用DATA来设置数组的初值。 Integer A(5)

DATA A /1,2,3,4,5/

DATA中的数据区中可以用“*”表示数据重复 Integer a(5)

Data a /5*3/ ! 5*3是指5个3 隐含式循环赋初值方法 INTEGER A(5) INTEGER I

DATA (A(I), I=2,4)/2,3,4/ !I从2增加到4,初值设定结果为A(2)=2, A(3)=3, A(4)=4, A(1)和A(5)没有设值初值。

可以省略DATA

INTEGER :: A(5)=(/I, I=1,5/) !A=[1,2,3,4,5], 注意括号和除号间不能有空格。

直接赋初值法:

INTEGER :: A(5)=(/1,2,3,4,8/) !给定的数据应与数组数据个数相同,否则将出现错误。

5.2.2 对整个数组的操作

Fortran90在Fortran77的基础上增加了许多新功能,大大简化了程序编写的复杂度,原来必须循环才能做到的事情,现在一个命令即可。

举例说明如下:

【a=5】将数组a的每一个分量值设为5;

【a=(/1,2,3/)】等号右边的数字数目必须和数组维数相同; 【a=b】a(i)=b(i) 【a=b+c】a(i)=b(i)+c(i) 【a=b-c】

37

数值分析程序设计——Fortran基础

【a=b*c】a(i,j)=b(i,j)*c(i,j),不是真正的矩阵乘法 【a=b/c】a(k,j)=b(k,j)/c(k,j) 【a=sin(b)】a(k)=sin(b(k))

【a=b>c】a,b,c为同维数组。a为逻辑型数组

5.2.3 部分数组的操作

A(3:5)=5 数组的3-5分量设置为5

A(3:)=5 数组第三个分量之后的分量设置为5 A(3:5)=(/1,2,3/) 数组的3-5分量设置为1,2,3

A(1:3)=B(4:6) 将数组B的第4-6分量值赋值给数组A的第1-3分量 A(1:5:2)=3 数组的第1 3 5分量设置为3 A(1:10)=A(10:1:-1) 数组翻转

A(:)=B(:,2) 数组B第二行赋值给数组A A(:,:)=B(:,:,3) 数组B第三维赋值给数组A

5.2.4 WHERE命令

WHERE命令可以根据逻辑判断来使用数组中的一部分元素。

program ex0711 implicit none integer :: i

integer :: a(5)=(/ (i,i=1,5) /) integer :: b(5)=0 where( a<3 ) b = a elsewhere b = 2 end where

write(*,\ stop end

38

山东建筑大学

这里程序将数组a中数值小于3的元素找出来,并把这些元素的值设置给数组b同样位置的元素,其他元素设置为2。程序执行结果得到数组b为:

1 2 2 2 2

5.2.5 FORALL命令

语法:forall(triple, mask) end forall

triple是一个三元组,省略第三个默认值为1,如I=1:10:2。Mask是用来作条件判断的,跟where命令中使用的条件判断类似。看一个例子:这个程序声明一个二维数组作为矩阵使用。使用forall命令把矩阵的上半部分设置为1,对角线设置为2,下半部分设置为3。

program ex0714 implicit none integer I,J

integer, parameter :: size = 5 integer :: 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

forall 可以写成多层嵌套结构,他里面只能出现跟设置数组有关的程序命令,还可以在Forall中使用where命令。不过where中不能使用forall命令。

5.3 数组的保存规则

数组在计算机内存中是按列连续保存的。一维数组按照索引大小顺序保存。对于高维数组低维为内循环,高维为外循环方式保存。例如对于二维数组,计算内存中的数组元素排列方式为:首先按行标顺序排列第一列元素,然后是第二列的元素,……,直到最后一列的元素。

39

数值分析程序设计——Fortran基础

读取数据时,应当注意数据的保存方式,以便能够比较快速地读取数据。

5.4 可变大小数组(ALLOCATABLE)

在某些情况下,实现不能确定数组维数的大小,这可以使用可变大小数组。在编写程序时,声明一个可变大小的数组。例:

program ex0716 implicit none integer :: students

integer, allocatable :: a(:) ! 声明一个可变大小的一维数组 integer :: i

write(*,*) \ read(*,*) students

allocate( a(students) ) ! 配置内存空间 ! 输入成绩 do i=1,students

write(*,\ read(*,*) a(i) end do stop end

使用可变大小数组要经过两个步骤,首先要声明,在声明数组时要加上allocatable,数组的大小不用赋值,使用冒号:说明是一个数组即可。声明后,这个数组还不能使用,要经过allocate命令到内存中配置足够的空间后才能使用数组。

5.5 数组的应用

例 选择排序法

program ex0718 implicit none

integer, parameter :: size=10

integer :: a(size) = (/ 5,3,6,4,8,7,1,9,2,10 /)

40