FORTRAN基础编程系列推出后,广受大家喜爱,原本是打算分享一些自己在学习Abaqus子程序时的语法疑难,分享了之后发现大家对此共鸣很多,为此木木尽可能多分享一些阅读子程序时需要用到的FORTRAN语法。语法这个问题很基础同样也很重要,很多人接触子程序,就直接阅读程序核心内容,对于一些程序语言的细节,却很少关注,往往导致出现一些简单的“Erro”,程序框架没问题,却找不到错误的解决方法。
本次推文主要分享FORTRAN中数组的概念,主要内容:数组的三种定义方法;动态数组Allocatable
的应用;二维数组的应用,参考了《Fortran语言程序设计——Fortran95》。代码运行环境均在 Simply Fortran中编译运行,具体操作方法,可点击查看Simply 保姆级教程。
程序中要使用任何一个数组都必须给予定义,即说明该数组的名字、类型、维数及大小,以便编译系统给数组分配相应的存储单元。
(1) 数组名:数组和变量一样,也用符号名来命名。
(2) 数组的类型:数组的类型由数组元素的类型来决定。
(3) 数组的维数:数组的维数即为了区分数组元素所需顺序号的个数。
(4) 数组的大小:数组的大小即数组中包含数组元素的个数,由数组每维下标的上界和下界来决定。
在Fortran 95中,数组说明方法有三种:
• dimension语句
• 类型说明语句
• 同时使用dimension语句和类型说明语句
dimension a(1:10), m(-10:10), b(4,10)
• dimension
语句是非执行语句,必须放在程序单位的可执行语句之前。
• 用dimension语句只说明了数组的名字、维数、大小等特性,但不能说明数组的类型,这时,数组类型的说明方法与变量名相同,即:
• 如无特别指明,数组的类型服从i-n规则(以i-n开头命名的为整数类型);
• 用类型说明语句指明数组的类型。dimension ju(20), name(-10:10,1:2)
real ju
character name
说明了一维实型数组ju
,共有 20 个元素。还有二维字符型数组name
,共有 42 个元素,每个元素的定义长度为 1。
• 用implicit
语句指明数组的类型
implicit integer (a-c),real(i,j)
dimension b(3:15),ix(10)
说明了整型数组b
和实型数组ix
。
类型说明语句可以直接说明数组的全部特性。其一般格式为:
character*6 ch(-10:10,5:9)*8
real kk(8)
real(8) solution(30)
double precision re(4,5)
分别说明了字符型数组ch
,数组元素的长度为 8。还有实型数组kk
和双精度一维数组solution
以及双精度二维数组re
。
real(8), dimension(0:10) :: a, b, c
integer,dimension(4,5) :: d, e
说明了三个双精度型数组a,b,c
,它们各含有 11 个元素。说明了两个整型数组d,e
,它们各含有 4×5 共 20 个元素。
Allocatable
的应用在程序的运行过程中,根据需要,动态地定义一个适合的数组来使用,可以节省存储空间,提高程序的执行效率。
动态数组定以后,在程序中,通过allocate
语句分配相应存储空间,确定数组的大小。使用完成后,要及时地通过deallocate
语句释放存储空间。
【例】输入某班级学生的一门成绩,计算出平均分。
分析:这里学生人数由键盘输入,根据人数确定数组的大小,保存成绩。因此采用动态数组。
integer n,aver
integer,allocatable:: a(:)
print *,"输入学生人数:"
read *,n
allocate(a(n))
print *,"输入学生成绩:"
do i=1,n
read*,a(i)
enddo
aver=0
do i=1,n
aver=aver+a(i)
enddo
aver=aver/n
print *,"aver=",aver
deallocate(a)
end
【例】设有一个
• 矩阵所有元素之和及平均值;
• 保留所有大于平均值的元素,其余元素清零。
integer,dimension(4,5):: a
data a/2,5,12,7,6,-1,0,6,4,3,4,-9,9,8,10,5,-13,7,2,3/
sum=0
do i=1,4
do j=1,5
sum=sum+a(i,j)
end do
end do
average=sum/(4*5)
print *,'sum',sum
print *,'average',average
do i=1,4
do j=1,5
if (a(i,j)<=average) a(i,j)=0
end do
end do
do i=1,4
write(*,*) (a(i,j),j=1,5)
end do
end
以上就是本次所要分享的全部内容了,希望对于正在接触 Frotran 的你有所帮助,我们下期再见~