您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > Fortran-95-程序设计-第五章---复件
七、数组中山大学环境科学与工程学院陆希复习—数据类型和属性一般形式:类型说明【(种别说明)】【,属性说明表】::变量名表【=初值】类型说明,五种,三种数值型:整数型、实数型、复数型两种非数值型:字符型,逻辑型种别说明,F90的新概念。一个数据,不仅有一个类型,在同一类型下还可分若干种别,种别值确定了数据的大小范围和精度。有了种别说明后,程序更易于移植。因为在不同的计算机系统上,同一种变量类型可以有不同的精度,因此当程序在另一种机子上运行时可能会出现溢出。规定种别则可以避免这种现象出现。一个数据通常在内存中占有一个存储单元。对整型数而言,如果该变量在程序中使用值范围很小,则只需半个存储单元,如果变量的整数变化范围很大,则存储时有必要占两个内存单元。实型数更复杂,除了存储的数值范围大小不同外,要求精度也会不同,有的只要8为有效值即可,有的则可能要24位有效值,因此所要求的存储单元数量不同,为了提高效率,节约内存,按照该变量表达的值范围与表达的精度范围,把同一类划分成几个种别,不同种别分配不同数目的内存单元。属性说明关键字很多。一般来说,数据属性描述了一个对象是如何在程序中被应用的。可以使用一个或多个语句来规定某个数据对象的属性。VisualFortran的数据属性如表所示:♦数组定义(基本使用)♦数组赋值与运算(内容设置)♦数组的保存规则♦可变大小的数组及其它♦数组的应用数组是科学和工程计算问题中常见的向量和矩阵的反映和概括。数组在FORTRAN程序中有着重要的意义,在批量大的情况下,如果不利用数组就失去了计算机的优越性。数组是另一种使用内存的方法,配置一大块内存空间,用以存储一批数据。统计100年内月平均温度及高于平均温度的月数。统计学校1500名学生的平均身高及大于平均身高的男女生人数。统计某商场近10年月平均销售额及高于平均销售额的月份。求解100元一次方程组。求解高阶微分方程。计算5050阶矩阵的转置矩阵。对某班30名学生的学习成绩进行排序处理。以上问题都要涉及几十、几百、几千,甚至上万个数据,如果在程序中采用简单的内部数据类型和变量来求解这类问题,其难度将大大增加,甚至无法设计和编写程序。!统计3个数的平均值及大于平均值的数据个数。使用普通变量和顺序结构实现。PROGRAMexample1REALa1,a2,a3,sum,avINTEGERnumREAD*,a1,a2,a3!输入3个数sum=a1+a2+a3;av=sum/3!求3个数之和,计算平均值num=0!赋初值IF(a1av)num=num+1!统计大于平均值的数据个数IF(a2av)num=num+1IF(a3av)num=num+1PRINT*,‘平均值为:’,av!输出平均值PRINT*,'大于平均值的数据个数为:',num!输出大于平均值的数据个数END!统计15个数的平均值及大于平均值的数据个数。使用普通变量和顺序结构实现。PROGRAMexample2REALa1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,sum,avINTEGERnumREAD*,a1,a2,a3,a4,a5,a6,a7,a8,aa9,a10,a11,a12,a13,a14,a15sum=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15av=sum/15;num=0IF(a1av)num=num+1IF(a2av)num=num+1IF(a15av)num=num+1PRINT*,'平均值为:',av;PRINT*,'大于平均值的数据个数:',numEND!统计15个数的平均值及大于平均值的数据个数。使用普通变量和循环结构实现。PROGRAMexample3REALa,sum,avINTEGERnumsum=0.0DOi=1,15READ*,asum=sum+aENDDOav=sum/15!该程序虽然变量比较少,程序比较短,但数据被输入两遍。num=0DOi=1,15READ*,aIF(aav)num=num+1ENDDOPRINT*,'平均值为:',avPRINT*,'大于平均值的数据个数为:',numEND!统计15个数的平均值及大于平均值的数据个数。使用数组和循环结构实现。PROGRAMexample4PARAMETER(max_num=20)REALa(max_num),sum,avINTEGERnumsum=0.0DOi=1,max_numREAD*,a(i)sum=sum+a(i)ENDDOav=sum/max_num!该程序变量少,程序短,数据输入一遍。num=0DOi=1,max_numIF(a(i)av)num=num+1ENDDOPRINT*,'平均值为:',avPRINT*,'大于平均值的数据个数为:',numEND输入四个数A、B、C、D,请按照由小到大顺序将这四个数排序后输出出来如果是10个数比较大小呢?♦数组定义数组是类型相同的一组标量数据的有序集合,即要求这些数据都必须类型相同,并按某种确定方式排列。任何一组类型相同且有序的数据都可使用数组存储。向量是一维数组,矩阵可看成是二维数组。类型可以是整型、实型、双精度型、逻辑型等任何一种。声明方法:输入四个数A、B、C、D,请按照由小到大顺序将这四个数排序后输出出来组成数组的每一个元素称为数组元素数组的维数称为秩(rank),F90规定数组最多可以有7维;在某一维中元素的个数称为该维的长度(extent);数组中所有元素的个数称为数组的大小(size),它等于各维的长度的乘积,数组的大小可以为0。数组的形状(shape)取决于秩和每一维的长度每一维的大小都由一个下界和一个上界来指定,之间以冒号分开,即下界:上界维界表达式是整型的数学表达式,维界值可以是正、负或零,但维上界必须大于维下界的值。维长=上界-下界+1。声明数组时下界可以省略,此时维下界为默认值1声明方法(严谨):数组(元素)的引用:例:uwnd数组名称,指整个数组uwnd(2)指定下标,确切指定一个元素uwnd(7:10)引用数组的一部分元素uwnd(1:359:2)引用数组的部分元素(三元下标,分别表示:下界、上界和步长。三元下标只能算一个下标)写出各步骤id的值?数组片段:数组片段是数组所有元素集合的一个子集。数组片段的元素可以是数组中任意的元素,它们不需连续或遵循某个规则。数组中的所有元素和片段的数据类型和种别都相同。如果指定数组的所有下标则得到的是数组元素(即标量),如果只指定部分下标则结果是部分数组元素的集合,即数组片段,数组片段本身也是数组。例:REALA(2,3,4)则A(1,2,3)是数组元素,而A(1:2,2,2),A(1,1,4:2:-1)都是数组片段♦数组赋值与运算赋初值1、用DATA赋初值:datavar/……/这是一个“隐含式”循环,I会从2增加到4,依照顺序到后面取数字,初始值设定结果为A(2)=2,A(3)=3,A(4)=4,A(1)和A(5)没有设定。隐含的循环省略了“DO”的描述,除了应用在声明的初值设置,还可以应用到其他的程序代码中,比如输出命令write(*,*)(a(i),I=2,4)!显示a(2),a(3),a(4)的值隐含循环,只要在后面多加一个数字,同样可以改变计数器的累加数值,默认值为1(A(I),I=2,10,2)!循环执行5次,I分别为2,4,6,8,10隐含式循环也可以是多层嵌套的,所以也可以应用在多维数组上DATA((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)=42、在声明变量时直接赋值(必须一次给齐所有初值)a(1)=1,a(2-4)=2,a(5)=5integer::Iinteger::a(5)=(/(I,I=1,5)/)a(1)=1,a(2)=2,a(3)=3,a(4)=4,a(5)=5其它赋值举例:C1=(/4,8,7,6/)!标量表示C2=(/B(1:5),B(7:9)/)!数组表示C3=(/(I,I=1,4)/)!隐DO循环C4=(/4,A(1:5),(I,I=1,4),7/)!混合表示INTEGERC(4)!可以用方括号代替括号和斜线,等价C=(/4,8,7,6/)!(/之间不能有空格C=[4,8,7,6]!与上等价INTEGERD(3)!下面两种格式等价D=(/1:5:2/)!三元下标格式D=(/(I,I=1,5,2)/)!隐DO循环格式数组的运算基本运算允许把整个数组或数组片段作为一个单独的对象进行运算。所有的算术运算符(+,-,*,/,**)、逻辑运算符(如.AND.,.OR.,.NOT.)和所有关系运算符(如.LT.,.EQ.,.GT.),以及许多内在函数都可以接受数组名称作为参数并对数组元素逐一运算。例:使用数组名作为参数的内在函数称为基本内在函数,例:REALA(5),B(5),C(5)INTEGERD(5)DATAPI/3.14159265/A=(/(REAL(I)*PI/180.,I=1,5)/)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)则不相容如果数组片段指定的部分相容,也可用于表达式和赋值例:REALA(5),B(4,7)A=20.;B=5.;A=A-B(2,1:5)数组的运算数组与数组两个数组作算术操作的结果仍是一个形状相同的数组,它的每个位置上元素的值是参与操作的相同位置上一对元素操作后的结果值例如有数组A、数组B,形状如下:111213111213212223212223,aaabbbABaaabbb则执行赋值语句C=A+B后,数组C的值即为:111112121313212122222323abababCABababab对于其它内部操作,如+、-、*、/、**等,操作结果也是一个形状相同的数组。其每个位置上的元素值是参与操作的数组相同位置(而非下标)上的一对元素作相同操作的结果。相当于?数组与标量数组表达式允许数组与标量作算术运算例:当A、B为形状相同的数组时,赋值语句A=B+2是合法的。1112132122232222222bbbABbbb即:数组与标量操作相当于数组内每一元素与该标量操作。数组内在函数数组表达式中允许对数组求基本函数,其函数值仍是一个形状相同的数组,它的每个位置上的元素值就是被操作数组对应位置元素取该函数值例:A、B为形状相同的一维数组,则语句B=SQRT(A)表示:B(1)=SQRT(A(1))、B(2)=SQRT(A(2)),…。例2对部分数组的操作a(3:5)=5把a(3),a(4),a(5)的内容设置为5,其他值不变。a(3:)=5把a(3)之后的元素内容都设置为5,其他值不变。a(3:5)=/(3,4,5)/a(3)=3,a(4)=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)=3a(1)=3,a(3)=3,a(5)=3a(1:10)=a(10:1:-1)使用类似隐含式循环的方法把a(1~10)的内容给翻转。a(:)=b(:,2)a(i)=b(i,2),其中i为数组范围内的任意数a(:,:)=b(:,:,1)a(i,j)=b(i,j,1),其中I,j为数组范围内的任意数例3integer,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
本文标题:Fortran-95-程序设计-第五章---复件
链接地址:https://www.777doc.com/doc-4877004 .html