Fortran学习:chapter7数组
创始人
2025-05-30 20:05:14
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)

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

相关内容

热门资讯

建筑合同范本-英文建筑合同样本... Party A:Party B:Contract NoDate:Signed at:Witnesse...
建筑合同范本-园林古建筑合同样... 发包方:(以下简称甲方)承包方:(以下简称乙方)经甲、乙双方协商一致,就甲方委托乙方建造兰埔花园园林...
建筑合同范本-土地使用权租赁协... 甲方:_________集团公司  住所:_________省_________市_________...
建筑合同范本-农村土地出租排水... 甲方:_________  法定代表人:_________  住址:_________  邮编:__...
合同范本-委托开发合同书样本 ... 甲方委托乙方研制_________装置,特商定如下合同:1.研制内容:_________。2.技术要...
Python爬虫——Pytho... Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个...
【linux】基本指令详解 文章目录【Linux】1. 基本指令详解前言--Linux操作系统由来1.1Linux发展史1.2L...
合同范本-技术培训合同样本 技... 委托方:_________??法定代表人或负责人:________??服务方:_______??法定...
合同范本-科技查新合同样本 房... 合同编号:查新项目名称中文:英文:委托单位名称:通信地址:邮政编码:电子信箱:负责人电话:传真:联系...
合同范本-软件外包合同范本样本... 甲方:_________乙方:_________(个人)身份证号码:________________...
Git 和 GitHub 超入... 工作流程 工作的流程应该遵循以下步骤: (1) 在 issue 跟踪系统中创建一个新的...
技术服务合同(含技术培训、技术... 项目名称:____________________________________________委...
转让技术秘密和补偿贸易合作生产... 甲方:____________________________________地址:________...
【Git】git环境如何搭建与... 搭建 Git 环境: 安装 Git 客户端:根据操作系统选择对应的版本进...
day36_jdbc 今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客...
与梦想有关的哲理说说短语 梦想...   01、 我就是我是颜色不一样的烟火天空海阔要做最坚强的泡沫。  02、 不论你在什么时候开始,重...
激励人生的励志签名致自己 激励...   01、 农村三驴子,进城。‰  02、 ≮问世间情为何物,一物降一物。≯  03、 上学的心情,...
青春励志个性签名正能量 励志个...   01、 还喜欢 还在意 但不渴望在一起  02、 努力吧一意孤行的公主  03、 让人耗尽心力的...
样本-合同范本-中外专有技术许... 中外专有技术许可合同签约时间:签字地点:合同号:中国,北京,×××公司(以下简称“受让方”)为一方,...
人生格言个性励志签名 微信励志...   01、 如果迩是棉花糖机,莪愿融化真心,旋转成手心旳云。  02、 人活着不是要用眼泪博得同情,...