首页/文章/ 详情

Fortan基础编程(6)——数组详解

1年前浏览299

FORTRAN基础编程系列推出后,广受大家喜爱,原本是打算分享一些自己在学习Abaqus子程序时的语法疑难,分享了之后发现大家对此共鸣很多,为此木木尽可能多分享一些阅读子程序时需要用到的FORTRAN语法。语法这个问题很基础同样也很重要,很多人接触子程序,就直接阅读程序核心内容,对于一些程序语言的细节,却很少关注,往往导致出现一些简单的“Erro”,程序框架没问题,却找不到错误的解决方法。

本次推文主要分享FORTRAN中数组的概念,主要内容:数组的三种定义方法;动态数组Allocatable的应用;二维数组的应用,参考了《Fortran语言程序设计——Fortran95》。代码运行环境均在 Simply Fortran中编译运行,具体操作方法,可点击查看Simply 保姆级教程



数组的定义

程序中要使用任何一个数组都必须给予定义,即说明该数组的名字、类型、维数及大小,以便编译系统给数组分配相应的存储单元。

(1) 数组名:数组和变量一样,也用符号名来命名。

(2) 数组的类型:数组的类型由数组元素的类型来决定。

(3) 数组的维数:数组的维数即为了区分数组元素所需顺序号的个数。

(4) 数组的大小:数组的大小即数组中包含数组元素的个数,由数组每维下标的上界和下界来决定。

数组的说明方法

Fortran 95中,数组说明方法有三种:

  • • dimension语句

  • • 类型说明语句

  • • 同时使用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

同时使用dimension语句和类型说明语句说明数组

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 的你有所帮助,我们下期再见~

来源:易木木响叮当
Abaqus
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-01
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 212粉丝 244文章 344课程 2
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈