Fortran程序设计5-数组.ppt

上传人:小飞机 文档编号:6505884 上传时间:2023-11-07 格式:PPT 页数:57 大小:380KB
返回 下载 相关 举报
Fortran程序设计5-数组.ppt_第1页
第1页 / 共57页
Fortran程序设计5-数组.ppt_第2页
第2页 / 共57页
Fortran程序设计5-数组.ppt_第3页
第3页 / 共57页
Fortran程序设计5-数组.ppt_第4页
第4页 / 共57页
Fortran程序设计5-数组.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《Fortran程序设计5-数组.ppt》由会员分享,可在线阅读,更多相关《Fortran程序设计5-数组.ppt(57页珍藏版)》请在三一办公上搜索。

1、七、数组,数组定义(基本使用)数组赋值与运算(内容设置)数组的保存规则可变大小的数组及其它数组的应用,数组是科学和工程计算问题中常见的向量和矩阵的反映和概括。数组在FORTRAN程序中有着重要的意义,在批量大的情况下,如果不利用数组就失去了计算机的优越性。,数组是另一种使用内存的方法,配置一大块内存空间,用以存储一批数据。,数组是类型相同的一组标量数据的有序集合,即要求这些数据都必须类型相同,并按某种确定方式排列。向量是一维数组,矩阵可看成是二维数组。类型可以是整型、实型、双精度型、逻辑型等任何一种。,数组定义,声明方法(例):DATATYPE ARRAYNAME(size1,size2,si

2、ze3)如:real:uwnd(359,180,9,12)real:stat(99,2),integer:statnum(99),组成数组的每一个元素称为数组元素 数组的维数称为秩(rank),F90规定数组最多可以有7维;在某一维中元素的个数称为该维的长度(extent);数组中所有元素的个数称为数组的大小(size),它等于各维的长度的乘积,数组的大小可以为0。数组的形状(shape)取决于秩和每一维的长度,每一维的大小都由一个下界和一个上界来指定,之间以冒号分开,即下界:上界 维界表达式是整型的数学表达式,维界值可以是正、负或零,但维上界必须大于维下界的值。维长上界-下界+1。声明数组时

3、下界可以省略,此时维下界为默认值1,声明方法(严谨):DATATYPE ARRAYNAME(下界:上界,)如:real:uwnd(1:359,1:180,1:9,1:12)real:stat(1:99,1:2),integer:statnum(99)integer:stanum(0:98),数组(元素)的引用:,例 real:a(1:359),uwnd 数组名称,指整个数组 uwnd(2)指定下标,确切指定一个元素uwnd(7:10)引用数组的一部分元素uwnd(1:359:2)引用数组的部分元素(三元下标,分别表示:下界、上界和步长。三元下标只能算一个下标),数组片段:,数组片段是数组所有元

4、素集合的一个子集。数组片段的元素可以是数组中任意的元素,它们不需连续或遵循某个规则。数组中的所有元素和片段的数据类型和种别都相同。如果指定数组的所有下标则得到的是数组元素(即标量),如果只指定部分下标则结果是部分数组元素的集合,即数组片段,数组片段本身也是数组。,例:REAL A(2,3,4)则 A(1,2,3)是数组元素,而 A(1:2,2,2),A(1,1,4:2:-1)都是数组片段,数组赋值与运算,赋初值,1、用DATA赋初值:data var/,2、在声明变量时直接赋值(必须一次给齐所有初值),其它赋值举例:,C1=(/4,8,7,6/)!标量表示C2=(/B(I,1:5),B(I:J

5、,7:9)/)!数组表示C3=(/(I,I=1,4)/)!隐DO循环C4=(/4,A(1:5),(I,I=1,4),7/)!混合表示,INTEGER C(4)!可以用方括号代替括号和斜线,等价 C=(/4,8,7,6/)!(/之间不能有空格C=4,8,7,6!与上等价,INTEGER D(3)!下面两种格式等价D=(/1:5:2/)!三元下标格式D=(/(I,I=1,5,2)/)!隐DO循环格式,数组的运算,基本运算,允许把整个数组或数组片段作为一个单独的对象进行运算。所有的算术运算符(+,-,*,/,*)、逻辑运算符(如.AND.,.OR.,.NOT.)和所有关系运算符(如.LT.,.EQ.

6、,.GT.),以及许多内在函数都可以接受数组名称作为参数并对数组元素逐一运算。,例:INTEGER,DIMENSION(100):even,odd,plu,min,tim,div,squeven=(/(2*i,i=0,49)/);odd=(/(2*i+1,i=0,49)/)plu=even+oddmin=even-oddtim=even*odddiv=even/oddsqu=even*2,使用数组名作为参数的内在函数称为基本内在函数,例:,REAL A(5),B(5),C(5)INTEGER D(5)DATA PI/3.14159265/A=(/(REAL(I)*PI/180.,I=1,5)/

7、)B=COS(A);C=SQRT(A);D=CEILING(A*180.),当两个以上数组出现在赋值语句或表达式中时,数组的形状应该相同(称为相容)。,例:A(2,3),B(2,3),C(2:3,6:8)相容;而 D(4,5),E(5,4),F(5,2,2)则不相容,如果数组片段指定的部分相容,也可用于表达式和赋值,例:REAL A(5),B(4,7)A=20.;B=5.;A=A-B(2,1:5),数组与数组,数组的运算,两个数组作算术操作的结果仍是一个形状相同的数组,它的每个位置上元素的值是参与操作的相同位置上一对元素操作后的结果值,例如有数组A、数组B,形状如下:,则执行赋值语句C=A+B

8、后,数组C的值即为:,对于其它内部操作,如+、-、*、/、*等,操作结果也是一个形状相同的数组。其每个位置上的元素值是参与操作的数组相同位置(而非下标)上的一对元素作相同操作的结果。,相当于?,数组与标量,数组的运算,数组表达式允许数组与标量作算术运算,例:当A、B为形状相同的数组时,赋值语句A=B+2是合法的。,即:数组与标量操作相当于数组内每一元素与该标量操作。,数组内在函数,数组的运算,数组表达式中允许对数组求基本函数,其函数值仍是一个形状相同的数组,它的每个位置上的元素值就是被操作数组对应位置元素取该函数值,例:A、B为形状相同的一维数组,则语句B=SQRT(A)表示:B(1)=SQR

9、T(A(1)、B(2)=SQRT(A(2),。,do j=1,2 do i=1,2 b(i,j)=a(2-i+1,2-j+1)end doend do,p136:,WHERE 命令(95新添),通过逻辑判断来使用数组的一部分元素,多重判断,FORALL 命令(95新添),隐含式循环使用数组的方法,练习 设数组,1、E数组描述为(1:2,1:3),F数组描述为(1:3),问下列数组表达式是否合法,不合法的说明理由,合法的写出计算结果:(1)E=A+B;(2)E=ABS(B)+2;(3)E=B+C(4)C=A+C;(5)F=D*D;(6)F=A(1:2,1)+B(1:3,1)(7)F=A(1,1:

10、3)+B(1,1:3),2、用WHERE构造,使上题中A元素2时,置B相应元素为自身的绝对值,否则使B中元素加1,写出最后B的内容。,数组的保存规则,一维数组:按照元素的顺序二维及多维数组:按列从低维到高维,数组逻辑结构:数组是一个与计算机实现无关的抽象的数据表。数组存储结构:数组是一个与计算机实现有关的具体的数据表(线性表),连续存储在若干存储单元中。,数组说明:INTEGER a(9)。逻辑结构、存储结构、相互关系:,数组说明:INTEGER a(3,4)。逻辑结构、存储结构、相互关系:,数组说明:INTEGER a(3,2,4)。逻辑结构、存储结构、相互关系:,数组说明:INTEGER

11、a(L1:U1,L2:U2,Ln:Un)。逻辑结构:逻辑结构可看成是由Un-Ln+1个n-1维数组构成,每个n-1维数组又可看成是由Un-1-Ln-1+1个n-2维数组构成,依次类推,直到每个二维数组又可看成是由U1-L1+1个一维数组构成。数组元素的下标a(i,j,k,r,s)决定该数组元素在逻辑结构中的位置。存储结构:存储结构是在计算机内存中分配的一串连续的存储单元,从第一个数组元素(如:a(L1,L2,Ln))开始,按照数组逻辑结构以列为主依次将数组元素分配在连续的存储单元中。多维数组的存储结构是一维线性表,多维数组的元素在存储结构中从左向右排列时,其下标变化如同加油站计数器反向变化,先

12、从1维开始变化,最后到n维变化,由此可得到多维数组的存储结构。相互关系:一一对应关系。,所以,应尽量避免使用高维数的数组;并在应用中充分考虑计算机存储和提取数据的方式、原则,尽量编写效率较高的程序。,例:三维数组声明 INTEGER a(-5:8,-3:4,10,15),有672个数组元素/数组元素a(2,1,13)在其存储结构中位于第400个元素。通过计算得到:8-(-5)+14-(-3)+1(13-10)+8-(-5)+11-(-3)+2-(-5)+1=1483+144+8=400,real uwnd(360,180,17,365),do l=1,365 do k=1,17 do j=1,

13、180 do i=1,360 sumu=aveu+uwnd(i,j,k,l)end do end do end doend do,F90的赋值语句考虑到了在并行机上计算的功能,即使不是用的并行计算机,在形式上也是按并行化处理的。这与F77中的串行赋值是不同的,由此造成了数组的F90赋值结果与采用DO循环方式进行赋值的差异,90赋值语句与DO循环的差异,例:INTEGER:a(0:9)=(/0,1,2,3,4,5,6,7,8,9/)a(1:9)=a(0:8)a的所有元素是并行处理的,结果是(/0,0,1,2,3,4,5,6,7,8/):|a(0)|a(1)|a(2)|a(3)|a(4)|a(5)

14、|a(6)|a(7)|a(8)|a(9)|a(0)|a(1)|a(2)|a(3)|a(4)|a(5)|a(6)|a(7)|a(8)|a(9)|,如果用DO循环的话DO i=1,9 a(i)=a(i-1)END DOA的元素是逐一处理的,结果是(/0,0,0,0,0,0,0,0,0/):|a(0)|a(1)|a(2)|a(3)|a(4)|a(5)|a(6)|a(7)|a(8)|a(9)|,要用DO循环达到和上面同样的效果,需要数组的拷贝:INTEGER:a(0:9)=(/0,1,2,3,4,5,6,7,8,9/),b(0:9)b=a DO i=1,9 a(i)=b(i-1)END DO,可变大小

15、的数组(动态数组),数组可以是静态的也可以是动态的。如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放。程序运行时静态数组的大小不能改变。静态数组的缺陷是,即使数组已经使用完毕,它仍占据着内存空间,浪费了系统资源。在给定的计算机内存资源情况下,耗费了其他数组可以利用的内存,并且超过资源的数组将导致程序执行错误。因此,F90增加了动态的数组功能,动态数组的储存在程序运行当中是可以分配、改变和释放的,动态数组只有两种:可分配数组和自动数组。自动数组和可分配数组很类似,区别在于当程序开始或结束时,自动数组会自动分配和释放内存。当用户分配动态存储空间时,数组的大小是在运行

16、时而不是在编译时确定的。动态分配可以用于标量和任何类型的数组。当用户给数组指定了可分配属性时并没有立即分配内存,而是直到使用ALLOCATE语句后才分配。随后还可以用DEALLOCATE语句释放内存空间,这时数组可以以其它形状或目的来使用,错误状态可以由ALLOCATE语句中的STAT值获得。如果指定STAT选项,语句的成功执行时将返回0,否则返回正值。若未指定STAT选项且出现错误时,程序将中止执行,例:INTEGER,ALLOCATABLE:A(:),B(:)INTEGER ERR_MESSAGEALLOCATE(A(10:25),B(SIZE(A),STAT=ERR_MESSAGE)IF

17、(ERR_MESSAGE.NE.0)PRINT*,ALLOCATION ERROR,DEALLOCATE语句用来释放已分配数组的内存,例:INTEGER,ALLOCATABLE:A(:),B(:)INTEGER ERR_MESSAGEALLOCATE(A(10:25),B(SIZE(A)DEALLOCATE(A,B,STAT=ERR_MESSAGE)IF(ERR_MESSAGE.NE.0)PRINT*,DEALLOCATION ERROR例:INTEGER,DIMENSION(:),ALLOCATABLE:freqREAD*,limitALLOCATE(freq(1:limit)DEALLOC

18、ATE(freq),只有被ALLOCATE语句分配的内存空间才可以被DEALLOCATE语句释放,否则产生运行错误。可以使用ALLOCATED语句判断数组是否被分配,错误状态可以由ALLOCATE语句中的STAT值获得,用内在函数ALLOCATED来判断一个数组是否已被分配。它的形式为:ALLOCATED(数组名)返回值是逻辑标量,已被分配时为真,现在还未被分配时为假,当数组的分配状态未定义时它也是未定义的。,例:REAL,ALLOCATABLE:A(:).IF(.NOT.ALLOCATED(A)ALLOCATE(A(5),当过程的执行被RETURN或END语句中止时,除非可分配数组是有SAV

19、E属性的,否则它的分配状态变成未定义的。但是,RETURN和END语句并不释放数组分配的内存,所以应该在退出子程序前主动释放数组分配的内存,应用举例:,1、排序2、矩阵相乘?,例计算N个测试数据的平均值和标准偏差。测试数据个数不定。解:已知:N个测试数据data为:X1,X2,X3,Xn。从键盘输入。实型。求:平均值Xa和标准偏差Xs。实型。平均值计算公式为:Xa=(X1+X2+X3+Xn)/N 标准偏差计算公式为:Xs=测试数据用一个一维数组X表示,平均值用变量Xa表示,标准偏差用变量Xs表示。测试数据个数不确定,假设最大个数max为50,实际个数为N。从键盘输入数据,数据以非数值字符为结束

20、标志。程序:输入数据:25.32,18.35,44.78,57.39,85.2,A 输出结果:测试数据:25.32 18.35 44.78 57.39 85.20 平均值:46.21 标准偏差:26.74,PROGRAM array881!说明变量和数组PARAMETER(max=50)INTEGER:N=0REAL:X(max),Xa,Xs,sum=0.0,data!从键盘输入数据并求和DO WHILE(.TRUE.)READ(*,*,IOSTAT=io)data IF(io0)EXIT N=N+1 X(N)=data sum=sum+dataENDDO,Xa=sum/Nsum=0.0DO

21、i=1,N sum=sum+(X(i)-Xa)*2ENDDOXs=SQRT(sum/(N-1)WRITE(*,(1X,测试数据:,F10.2)(X(i),i=1,N)WRITE(*,(1X,平均值:,F10.2)XaWRITE(*,(1X,标准偏差:,F10.2)XsEND,例根据试卷难易程度,需要对学生成绩做适当调整(加减分数)。给定某班学生成绩和加减分数值,根据加减分数值调整学生成绩,调整成绩大于100分按100分记,小于0分按0分记,按优、良、中、及格和不及格确定学生成绩等级。统计调整前和调整后平均成绩。输出调整前学生成绩和平均成绩,以及调整后学生成绩、成绩等级和平均成绩。059 606

22、9 7079 8089 90100不及格 及格 中 良 优解:已知:学生姓名name、成绩score、加减分数delta。从键盘输入。求:调整前平均成绩old_av、调整后平均成绩new_av、调整后成绩等级grades。用四个数组:names、old_scores、new_scoress、grades,分别存储调整前姓名、成绩、调整后成绩、等级。其中:names和grades为字符串数组,old_scores和new_scores为整型数组。学生人数不确定,假设最大数max为200,实际学生人数为n。,PROGRAM array882PARAMETER(max=200)INTEGER:n=0

23、,io,delta,score,old_scores(max),new_scores(max)CHARACTER*10:name,names(max),grades(max)*6REAL:sum=0,old_av,new_avOPEN(1,FILE=array881.dat)DO WHILE(.NOT.EOF(1))READ(1,*)name,score n=n+1;sum=sum+score;names(n)=name;old_scores(n)=scoreENDDOold_av=sum/nWRITE(*,(1X,输入一个加减分数值:,)READ*,deltaDO i=1,n!调整学生成绩

24、new_scores(i)=old_scores(i)+delta;sum=sum+new_scores(i)ENDDO,WHERE(new_scores100)new_scores=100;WHERE(new_scores0)new_scores=0sum=0.0DO i=1,n sum=sum+new_scores(i)IF(new_scores(i)60)THEN grades(i)=不及格 ELSEIF(new_scores(i)70)THEN grades(i)=及格 ELSEIF(new_scores(i)80)THEN grades(i)=中 ELSEIF(new_scores(

25、i)90)THEN grades(i)=良 ELSE grades(i)=优 ENDIF ENDDO,new_av=sum/n!输出数据WRITE(*,(1X,学生姓名,2X,调整前成绩,2X,调整后成绩,2X,成绩等级)WRITE(*,(1X,44A1)(-,i=1,44)DO i=1,n WRITE(*,100)names(i),old_scores(i),new_scores(i),grades(i)ENDDOWRITE(*,(1X,44A1)(-,i=1,44)WRITE(*,(1X,调整前平均成绩:,F7.2)old_avWRITE(*,(1X,调整后平均成绩:,F7.2)new_a

26、v100 FORMAT(1X,A10,2X,I10,2X,I10,2X,A6)END,使用数据文件,按规定格式输入有关输入数据,如:王刚,45 赵平全,78 司马俊男,87 杨莉红,98 张军,58 运行程序,从键盘输入数据:输入一个加减分数值:10 程序运行后,输出结果为:学生姓名 调整前成绩 调整后成绩 成绩等级-王刚 45 55 不及格 赵平全 78 88 良 司马俊男 87 97 优 杨莉红 98 100 优 张军 58 68 及格-调整前平均成绩:73.20 调整后平均成绩:81.60,矩阵乘积函数:MATMUL(A,B)向量点乘函数:DOT_PRODUCT(A,B)元素求和函数:SUM(ARRAY,DIM,MASK)元素连乘求积函数:PRODUCT(ARRAY,DIM,MASK)数组查询函数:包括SIZE、SHAPE、ALLOCATED、LBOUND和UBOUND函数 数组的构造函数:包括MERGE、PACK,UNPACK和SPREAD函数 数组重构形函数:RESHAPE(SOURCE,SHAPE,PAD,ORDER)数组运算函数:包括TRANSPOSE、EOSHIFT和CSHIFT三个函数 数组定位函数:有MAXLOC和MINLOC两个函数,F90中增加了许多新的数组专用内在函数,使得数组的运算更加灵活方便,F90数组运算内在函数表,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号