Fortran学习:chapter7数组
创始人
2025-05-30 20:51:57
0

1.数组

1.1声明数组

数组的声明方法:Datatype name(size),其中,Datatype代表数组的类型,除4种基本类型(integer、real、complex、logical),还有type自定义的类型;name代表数组变量的名字,size代表数组的大小,必须用整型。

!声明数组!法一integer a1(10) !法二integer,dimension(10)::a2!法三integer a3dimension a3(10)!法四Type::personreal::height,weightEnd typeType(person)::a4(10) !用personl这个新类型来声明数组a4(1)%height=180.0 !在变量后边加上“%”来使用person类型中的元素a4(1)%weight=70
implicit noneinteger,parameter::students=5integer::student(students)integer iType::personreal::height,weightend TypeType(person)::a(1) !声明数组a(1)%height=180.0 !在变量后面加上"%"来使用person类型中的元素a(1)%weight=70write(*,"('person:',f5.1,f5.1)") a(1)%weight,a(1)%heightdo i=1,studentswrite(*,"('Number:',I2)")iread(*,*)student(i)end dodo while(.true.)write(*,*)"Query:"read(*,*)iif(i<=0 .or. i>students) exitwrite(*,*)student(i)end dopause

在这里插入图片描述

1.2 二维数组

使用二维数组时,要给两个坐标索引值。

implicit noneinteger,parameter::classes=5integer,parameter::students=5 integer::student(students,classes)integer s !用来赋值学生号码integer c !用来赋值班级号码do c=1,classesdo s=1,studentswrite(*,"('Number',I2,'  of class',I2)")s,c read(*,*)student(s,c) !第c班的第s位学生end doend dodo while(.true.)write(*,*)"class:"read(*,*)cif(c<=0 .or. c>classes) exitwrite(*,*)"student:"read(*,*)sif(s<=0 .or. s>students) exitwrite(*,"('score:',I3)") student(s,c) end dopause

将二维数组作为矩阵使用。

implicit none!二维数组作为矩阵使用!让用户输入两个2*2矩阵的值,再把这两个矩阵相加integer,parameter::row=2integer,parameter::col=2integer::matrixA(row,col)integer::matrixB(row,col)integer::matrixC(row,col)integer r !用来赋值rowinteger c !用来赋值col!读取矩阵A的内容write(*,*)"Matrix A"do r=1,rowdo c=1,colwrite(*,"('A(',I1,',',I1,')=')")r,cread(*,*)matrixA(r,c)end doend do!读取矩阵B的内容write(*,*)"Matrix B"do r=1,rowdo c=1,colwrite(*,"('B(',I1,',',I1,')=')")r,cread(*,*)matrixB(r,c)end doend do!把矩阵A,B相加并输出结果write(*,*)"Matrix A+B="do r=1,rowdo c=1,colmatrixC(r,c)=matrixB(r,c)+matrixA(r,c)write(*,"('(',I1,',',I1,')=',I3)")r,c,matrixC(r,c)end doend do

在这里插入图片描述

1.3多维数组

Fortran最多可以声明7维数组。

!与上述代码作用一致,只是再循环上多了一层,改进了一点算法。
implicit none!三维数组integer,parameter::row=2integer,parameter::col=2integer::matrix(row,col,3)integer m !用来赋值第几个矩阵integer r !用来赋值rowinteger c !用来赋值col!读取矩阵的内容do m=1,2write(*,"('Matrix',I1)")mdo r=1,rowdo c=1,colwrite(*,"('(',I1,',',I1,')=')")r,cread(*,*)matrix(r,c,m)end doend doend do!把第1,2个矩阵相加write(*,*)"Matrix1+Matrix2="do r=1,rowdo c=1,colmatrix(r,c,3)=matrix(r,c,1)+matrix(r,c,2)write(*,"('(',I1,',',I1,')=',I3)")r,c,matrix(r,c,3)end doend do

在这里插入图片描述

1.5另类数组的声明

通常情况下数组的索引值从1开始:
例如:integer a(5) !a(1),a(2),a(3),a(4),a(5)这5个元素
通过声明改变这个默认的规则:

①integer a(0:5) !a(0),a(1),a(2),a(3),a(4),a(5)这6个元素
②integer a(-3,3) !a(-3),a(-2),a(-1),a(0),a(1),a(2),a(3)这7个元素
③integer a(5,0:5) !a(1~ 5 ,0~5)
④integer a(2:3,-1:3) !b(2~ 3,-1~3)

2.数组内容的设置

2.1 赋初值

integer A2(5)DATA A2 /1,2,3,4,5/ !A(1)=1,A(2)=2,...,A(5)=5!DATA的数据区中还可以使用星号*来表示数据重复integer B(5)DATA B /5*3/ !这里5*3指有5个3,而不是计算5*3!B(1)=3,B(2)=3,...,B(5)=3!隐含式循环功能用来设置数组的初值integer A1(5)integer I1DATA(A1(I1),I1=2,4)/2,3,4/ !I从2增加到4,依据顺序取后边的值,这里A(2)=2,A(3)=3,A(4)=4;A(1),A(5)没有赋值!在最后多加一个数字,同样可以改变计数器的累加数值,默认值为1!(A(I),I=2,10,2),循环执行5次,I分别为2、4、6、8、10!隐含式循环可以多层嵌套,可以应用于多维数组上:integer A(2,2)integer I,JDATA((A(I,J),I=1,2),J=1,2)/1,2,3,4/ !括号里面的循环会先执行!结果:A(1,1)=1,A(2,1)=2,A(1,2)=3,A(2,2)=4!Fortran90中,可以省略DATA描述,直接设置初值integer::aa(5)=(/1,2,3,4,5/) !注意括号与除号之间不能有空格!这里aa(1)=1,aa(2)=2,aa(3)=3,...!省略DATA时,不能像使用DATA时一样,每个元素都必须给定初值!Integer::a(5)=(/(2,I=2,4))/,这里a(1),a(5)没有给定,会出现错误!integer::a(5)=(/1,(2,I=2,4),5/),这里a(1)=1,a(2)=a(3)=a(4)=2,a(5)=5!integer::I!integer::a(5)=(/I,I=1,5/) ,a(1)=1,a(2)=2,...,a(5)=5

实例:查询学生成绩

implicit noneinteger,parameter::students=5integer::student(students)=(/80,90,85,75,95/)integer ido while(.true.)write(*,*)"Query:"read(*,*)iif(i<=0 .or. i>students)exitwrite(*,*)student(i)end do

在这里插入图片描述

integer,parameter::row=2integer,parameter::col=2integer::m(row,col)integer r !用来赋值rowinteger c !用来赋值coldata((m(r,c),r=1,2),c=1,2)/1,2,3,4/ !m(1,1)=1,m(2,1)=2,m(1,2)=3,m(2,2)=4write(*,"(I3,I3,/,I3,I3)")((m(r,c),c=1,2),r=1,2) !按顺序输出m(1,1)=1,m(1,2)=3,m(2,1)=3,m(2,2)=4

在这里插入图片描述

2.2 对整个数组操作

integer,parameter::row=2integer,parameter::col=2integer::ma(row,col)=(/1,2,3,4/)integer::mb(row,col)=(/2,3,4,5/)integer::mc(row,col)integer::i,jmc=ma+mbwrite(*,"(I3,I3,/,I3,I3)")((mc(i,j),i=1,2),j=1,2)

在这里插入图片描述

2.3 对部分数组操作

①a(3:)=5, a(3)=a(4)=a(5)=5;
②a(1:3)=b(4:6), a(1)=b(4),a(2)=b(5),a(3)=b(6)
③a(1:5:2)=3, a(1)=a(3)=a(5)=3
④a(1:10)=a(10:1:-1), 将a中元素倒序
⑤a(:)=b(:,2), 将二维数组b的第二列元素按顺序给一维数组a
⑥a(:,:)=b(:,:,1), 将三维数组b的一部分给二维数组a
要求:
(1)等号两边所使用的数组元素数目一样多;
(2)同时使用多个隐含式循环时,较低维的循环可以想象为内层的循环。
eg:integer::a(2,2),b(2,2)
b=a(2:1:-1,2:1:-1)
b(1,1)=a(2,2),b(2,1)=a(1,2),b(1,2)=a(2,1),b(2,2)=a(1,1)

integer,parameter::row=2integer,parameter::col=2integer::a(2,2)=(/1,2,3,4/)!a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4integer::b(4)=(/5,6,7,8/)integer::c(2)write(*,*)awrite(*,*)a(:,1)c=a(:,1)write(*,*)cwrite(*,*)c(2:1:-1)c=b(1:4:2)write(*,*)c

在这里插入图片描述

2.4 WHERE

用来取出部分数组内容进行设置。

integer::i
integer::a(5)=(/(i,i=1,5)/)
!a(1)=1,a(2)=2,...a(5)=5
integer::b(5)=0!把a(1-5)中<3的元素值设置给b
where(a<3)b=a
end where!where处理问题时两者间的长度必须一致!把a(1-5)中<3的元素值设置给b
where(a<3)b=1
elsewhere !配合使用elsewhereb=2
end wherewhere(a<2) b=1
elsewhere(a>5) b=2
elsewhere b=3
end wherewrite(*,"(5(I3,1X))")b  !5个数字的设置均为一个整数占3格,一个空格

在这里插入图片描述
在这里插入图片描述
例子:假设年所得3万以下所得税率为10%,3万到5万之间为12%,5万以上为15%。使用WHERE命令来计算,并记录10个人的所得税金额。

implicit none
integer::i
real::income(10)=(/25000,30000,50000,40000,35000,&
60000,27000,45000,20000,70000/)
real::tax(10)=0where(income<30000.0)tax=income*0.10
elsewhere(income<50000.0)tax=income*0.12
elsewheretax=income*0.15
end wherewrite(*,"(10(F8.1,1X))") tax

在这里插入图片描述

2.5 FORALL

语法:
forall(triplet1[,triple2[,triplet3…]],mask)

end forall
tripletn用来赋值数组坐标范围的值,mask用作条件判断且只作用于数组中符合条件的元素。

例子:声明一个二维数组作为二维矩阵使用,使用forall命令把矩阵的上半部设置为1,对角线部分设置为2,下半部设置为3。

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

在这里插入图片描述

2.6 可变大小的数组

某些情况下,要等到程序执行之后,才会知道所需要使用的数组大小。
allocate(a( )) !配置内存空间;
deallocate !逆向运行,把allocate命令所得到的内存空间释放掉。
allocate(a(100),stat=erro) !error是事先声明的整型变量,做allocate这个动作时会经由stat这个叙述传给error一个数值,如果error=0则表示allocate数组成功,而如果error不等于0,则表示allocate数组失败。

2.7 数组的应用

例1:选择排序法

swap命令可以用来交换两个变量的内容,在main函数中使用。

implicit none
integer,parameter::size=10
integer::a(size)=(/5,3,6,4,8,7,1,9,2,10/)
integer::i,j
integer::tdo i=1,size-1do j=i+1,sizeif(a(i)>a(j)) thent=a(i)a(i)=a(j)a(j)=tend ifend do
end dowrite(*,"(10I4)")a

在这里插入图片描述
例2:
在这里插入图片描述

implicit noneinteger,parameter::L=3,M=4,N=2real::A(L,M)=(/1,2,3,4,5,6,7,8,9,10,11,12/)real::B(M,N)=(/1,2,3,4,5,6,7,8/)real::C(L,N)integer::i,j,kdo i=1,Ldo j=1,NC(i,j)=0.0do k=1,MC(i,j)=C(i,j)+A(i,k)*B(k,j)end doend doend dodo i=1,Lwrite(*,*)C(i,:)end do

在这里插入图片描述

3.课后习题

    implicit none!1integer,parameter::size=10integer::iinteger::a(size)=(/(i*2,i=1,10)/)write(*,"('a(i),i=1:10的均值为:',f5.2)")real(sum(a))/real(10)!2!integer a(5,5) 5*5=25个!integer b(2,3,4) 2*3*4=24个!integer c(3,4,5,6) 3*4*5*6=360个!integer d(-5:5) 11个!integer e(-3:3,-3:3) 7*7=49个!3integer::iinteger,parameter::size=10integer::f(size)f(1)=0f(2)=1do i=3,10f(i)=f(i-1)+f(i-2)end dowrite(*,"(10I4)")f!4integer,parameter::size=10integer::a(size)=(/5,3,6,4,8,7,1,9,2,10/)integer::i,j,tdo i=1,size-1do j=i+1,sizeif(a(i)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

给老师的春节贺卡祝福语 给老师的春节贺卡祝福语170句  在我们平凡的日常里,要用到祝福语的情况还是蛮多的,祝福语可以起到增...
父亲节暖心祝福语 父亲节暖心祝福语  在日复一日的学习、工作或生活中,大家都用到过祝福语吧,祝福语有助于促进交流,拉近...
温馨教师节祝福语 2020年温馨教师节祝福语集锦45条  您辛劳了,教师节到了,您也该歇一歇了,坐着接接电话看看短信吧...
《RabbitMQ高阶知识》—... 《RabbitMQ高阶知识》— 消息可靠性 文章目录《RabbitMQ高阶知识》— 消息可靠性&#x...
Kubernetes(5):P... 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建...
学校领导新年元旦祝福语 学校领导新年元旦祝福语校师生员工们:  新年的钟声Ji荡着神州大地,岁月的航船开启着新的征程,我们即...
hugginface相关数据集... swaption2009/20k-en-zh-translation-pinyin-hsk 翻译 S...
孙子满月酒贺词 孙子满月酒贺词  宝宝降生,我前来贺喜,愿新生的小宝贝给你们带来数不尽的`快乐,祝小宝贝身体健康,茁...
温馨端午节祝福语句 常用温馨端午节祝福语句70句  端午快乐,幸福甜蜜!下文是小编特意为各位读者准备的温馨端午节祝福语句...
SQL常用语法语句 文章目录1. 什么是sql语句?1.1 DDL(数据定义语言)用法2. 什么是数据库对...
暖心重阳节祝福语短信 2020年暖心重阳节祝福语短信大汇总77句  九九重阳节日到,我的短信首先到,登高望远先敬老,赏菊插...
经典七夕祝福语 经典七夕祝福语99句  枯草连天太苍茫,小路白杨一行行。牵手偶因手太凉,曾经一起看夕阳。夕阳挂在柳梢...
感恩老师贺卡祝福语 感恩老师贺卡祝福语(精选270句)  无论是身处学校还是步入社会,大家都写过祝福语,肯定对各类祝福语...
妇女节祝福语QQ 2020年妇女节祝福语QQ大汇总25句  送你杯茶,以芬芳的祝福为叶,温柔的叮嘱做花,用沸腾的热情为...
DINO-DETR 实验与分析 前言 自DETR提出之后,不计其数的DETR改进模型不断被提出,尽管如此...
[图神经网络]图卷积神经网络-... 一、消息传递         由于图具有“变换不变性”(即图的空间结构改变不会影响图的性状)...
开业花篮贺词 开业花篮贺词  在日常学习、工作抑或是生活中,大家对贺词都不陌生吧,贺词要求感情真挚,切合身份,用语...
乔迁之喜祝福语八个字 乔迁之喜祝福语八个字  一、祝福语传递途径  1、在聚会、宴会、烛光餐等庆祝的场合,参与者对主角直接...
开业贺词祝福语 开业贺词祝福语(精选170句)  在日常的学习、工作、生活中,大家都经常接触到祝福语吧,借助祝福语人...
CI/CD发布方式-蓝绿发布、... 发布方式 应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境&...