第7章 数 组
定义
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
DIMENSION A1(N1), A2(N1, N2), ASD(N1, N2, N3),K(N,M)
定义了三个数组。
说明:
1 定义语句,放在执行语句之前;
2 数组类型遵循I-N规则。可强行说明。
例 DIMENSION A1(4,5), I(10), M(5,5), SS(100),LA(8)
REAL I, M 不能写成REAL I(10), M(5,5)
INTEGER A1
LOGICAL LA
或直接写成:
REAL I(10), M(100)
INTEGER A1(4,5), SS(100)
LOGICAL LA(8)
3 同一程序块中,数组名和变量名不能相重,也不能用同一数组名代表不同的数组。例如:
DIMENSION X(5), X(5,5)
X=3.
4
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
fortran 中N1 ,N2, N3 为正整数,定义数组的大小。
很多版本允许如下格式定义:
DIMENSION X(2 : 5), XX(4 : 5, 5 : 6)
定义了X数组有X(2 ),X(3 ),X(4 ),X(5 )四个元素。
XX有XX(4 ,5 ), XX(4,6) ,XX( 5, 5),XX(5, 6) 四个元素。
还允许下标为负整数,例如:
DIMENSION X(-2 :2)
定义了X数组有X(-2 ),X(-1 ),X(0 ),X(1 ) ,X(2 )五个元素。
特别注意:限制的放宽往往会有一定的隐患:
例如:DIMESION A( 2 , 2 )
DO I= - 2,2
DO J= - 2,2
A( J, I )=I
ENDDO
ENDDO
WRITE(*,*) A
STOP
END
发现结果的值不对,所以特别注意数组越界的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
。
数组的输入和输出
多维数组元素在计算机内存中按列排列,
DIMENSION A( 3 , 3 )
顺序为:
A( 1 , 1 ) A( 2 , 1 ) A( 3 , 1 )
A( 1 , 2 ) A( 2 , 2 ) A( 3 , 2 )
A( 1 , 3 ) A( 2 , 3 ) A( 3 , 3 )
输入输出方式
1 A( I, J ) = e 表达式
2 输入
READ( N , *) A 从文件或键盘读,特别注意顺序,按列。
输出
WRITE( N, *) A 写到文件或显示器。
3 输入
DO 100 I=1,3
DO 100 J=1,3
100 READ( N , * ) A( I, J ) 该循环式按行顺序读入。
输出
DO 100 I=1,3
DO 100 J=1,3
100 WRITE( N , * ) A( I, J ) 该循环式按行顺序输出。
4 隐含循环
1===========================
WRITE( N , * ) (A( I ), I=1,3)
顺序等效于
DO 100 I=1 , 3
100 WRITE(N,*) A(I)
2===========================
WRITE( N , * ) (A( I, J ), J=1,3)
DO 100 I=1 , 3
100 WRITE(N,*) A( I, J )
3===========================
WRITE( N , * ) ( (A ( I, J ) , J = 1,3), I = 1, 3)
顺序等效于
DO 100 I= 1, 3
DO 100 J= 1, 3
100 WRITE( N , * ) A ( I, J )
4===========================
WRITE( N , * ) ( A, B,I = 1, 3)
顺序等效于
DO 100 I= 1, 3
100 WRITE( N , * ) A ,B
或 等效于WRITE( N , * ) A ,B ,A ,B,A ,B
5===========================
WRITE( N , * ) ( (A ( I, J ) , C,J = 1,3), B(I), I = 1, 3)
顺序等效于
DIMENSION A(3,3),B(3)
DO 20 I=1,3
DO 20 J=1,3
A(I,J)=J
20 B(I)=J*I
WRITE(*,*)‘================’
DO 200 I= 1, 3
DO 100 J= 1, 3
100 WRITE( N , * ) A ( I, J ) ,C
200 WRITE( N , * ) B ( I)
STOP
END
1.000000 2.000000 3.000000 3.000000 1.000000 2.000000 3.000000 6.000000 1.000000 2.000000 3.000000 9.000000
A(1,1) A(1,2) A(1,3) B(1) A(2,1) A(2,2)
A(2,3) B(2) A(3,1) A(3,2) A(3,3) B(3)
‘================’
1.000000 A(1,1)
2.000000 A(1,2)
3.000000 A(1,3)
3.000000 B(1)
1.000000 A(2,1)
2.000000 A(2,2)
3.000000 A(2,3)
6.000000 B(2)
1.000000 A(3,1)
2.000000 A(3,2)
3.000000 A(3,3)
9.000000 B(3)
好处 每个WRITE 自动回车并换行
循环每一次都是一个新的WRITE
隐含循环只有一个WRITE,所以不回行。
5 下标的
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
标准FORTRAN程序中数组元素的下标可以用整型变量、整型常数或整型表达式来表示。但是不管用什么形式,它们的值都必须是大于零的整数。
标准FORTRAN对下标表达式的形式有严格的规定,下标表达式必须按照“线性”形式:
例如:3k+4
来表示。其中n、m为正整数,而I为整型变量。
例如:
正确的下标表示方式 错误的下标表示方式
A(I+1) A(1+ I)
A1(2*N) A1( N *2)
X(2*K-3) X(K*2-3)
YUN(3*M+6) YUN(6+3*M)\
因此,在标准FORTRAN中下标表达式的形式一共只有七种:
M I I+m I-m nI nI+m nI-m
6 在程序中不允许出现以下表示数组元素的方式:
S=A(M(J))
即下标不能用数组元素的形式,而应该写成:
K=M(J)
S=A(K)
许多FORTRAN版本对于下标有各种扩充。例如允许多于三个下标,达127个下标;下标允许用负整数或零;可以是任意形式的算术表达式并能自动取整数等。用时特别注意出错。
作业
1 检验以上定义语句、输值语句、输出语句。
2 打印乘法口角表。
两重循环 K(I,J)=I*J
3 10 个数按大小排序。
冒泡,沉底
两重循环
白色开始
C=============================================c
C 乘法口角表
C 2007.4.8 Lao Zhang
C=============================================
DIMENSION II(9,9)
DO 20 I=1,9
DO 20 J=1,9
20 II(I,J)=J*I
WRITE(*,*)' (1) (2) (3) (4) (5) (6) (7) (8) (9)'
DO 100 I=1,9
100 WRITE( * , 10) I, ( II ( I, J ) , J = 1,I)
10 FORMAT(2X,1H(,I1,1H),9I4)
STOP
END
白色结束
白色开始
C=============================================c
C 排序
C 2007.4.8 Lao Zhang
C=============================================
DIMENSION A(100)
C
OPEN(15,FILE='PAIXU.DAT')
C
OPEN(25,FILE='PAIXU.OUT')
READ(*,*) N
DO 20 I=1,N
20
READ(*,*) A(I)
DO 100 I=2,N
DO 100 J=1,N-1
IF(A(I).LT.A(J)) THEN
T=A(I)
A(I)=A(J)
A(J)=T
ENDIF
100 CONTINUE
110 WRITE( * , *) (A(I),I=1,N)
STOP
END
白色结束
第八章 语句函数
在程序中定义函数。(自定义函数)
定义格式:
F(x1, x2, x3,….)=e 数学或逻辑表达式
引用格式:
A=F(x1, x2, x3,….)
说明:
1、函数名用户自己取。最多识别6个字母和数字。
2、函数类型遵循I-N规则。
强行说明:(定义函数之前)
REAL Ip,L
Ip(I,X,L)=SIN(I*X)+COS(2.*I*X)+L
自变量也分类型。
3、语句函数的虚拟自变量(也叫形式参数或哑元)
虚拟自变量之间不能同名,不能有常数,不能用数组元素表示,至少一个,用逗号隔开。
4、虚拟自变量完全是虚设的。不代表任何数值,只是在形式上表示表达式中有几个变量,并用它来区别这些变量的类型和在表达式中的作用。因此,可以和同一程序块中的其他变量、重名,彼此之间不受影响。(但不能和数组重名)
例如:
DIMENSION X(10)
Ip(I,X)=SIN(I*X)+COS(2.0*I*X)(错 数组)
FF(I, X)=I * X+X*X 两个之间无联系
I=10.0
X(1)=2.0*I
X(2)=IP (2, 5.5)
5、语句函数的表达式 e 是数学或逻辑表达式。
表达式中除虚拟变量之外,还可以是常数、标准函数和已定义过的函数。(不能引用自己)
例如:
P(I,X)=SIN(I*X)+COS(2.0*I*X)
F(A, B, N, Y)=A*P(N,Y)+B*SIN(A)+P(N,B)
6、一个语句函数只能在一行定义完,表达式太长时用续行。
7、只能在本程序块中使用。
8、方在执行语句之前,变量类型定义之后。
语句函数的引用:
引用格式:
A=F(x1, x2, x3,….)
说明:
1、函数只能得到一个具体的值,数学值或逻辑值。
2、函数引用中的自变量是实自变量变量(实参数或实元)。
实参可以是常数、变量、数组元素和表达式,还可以是其他语句函数,还可以是函数自身。(即含有已知所有语句函数)
作为实参的变量,数组元素必须已经附值。
例如:
P(I,X)=SIN(I*X)+COS(2.0*I*X)
F(A, B, N, Y)=A*P(N,Y)+B*SIN(A)+P(N,B)
C===========================================
I=4
X=9.8
X1=P(2,5.0)
X2=P(2, P(3,8.0))
X3=F(P(2,5.0),3.14,5,X)
X4=P ( INT(P(5,SIN(X))), F(3.14, P(3,2.*X),I,P(I,COS(X))))
相当于:T1=SIN(X) R1=COS(X)
T2= P(5,T1) R2= P(I,COS(X))
L3=INT(T2) R3=P(3,2.*X)
R4=F(3.14 , R3, I, R2)
X4=P(L3, R4)
作业:
1、级数
N项的和可表示为如下公式:
写一程序计算多组 x,y,n 对应的计算值。(将多组值从文件读到数组)并用循环计算级数值进行检验。
白色开始
C===========================================C
C Test function 1 C
C===========================================C
DIMENSION A(10) ,B(10),N(10)
SUM(X,Y,N)=(X*X*(X**(2.0*N)-1))/(X*X-1)+
! X*Y*(X**N*Y**N-1)/(X*Y-1)
WRITE(*,*)'PLEASE INPUT M , M><11'
READ(*,*)M
DO K=1,M
WRITE(*,20) K,K,M
READ(*,*) A(K),B(K),N(K)
ENDDO
20 FORMAT(4H K=,2I5,2H /,I2)
DO K=1,M
X=0
DO I=1,N(K)
X=X+A(K)**I*(A(K)**I+B(K)**I)
ENDDO
WRITE(*,*)'======================================'
IF(A(K).EQ.1.0.OR.A(K)*B(K).EQ.1.0)THEN
WRITE(*,10) A(K),A(K)*B(K),N(K),X
ELSE
WRITE(*,*) 'S=',SUM(A(K),B(K),N(K)),'S=',X
ENDIF
ENDDO
10 FORMAT(2X,2HX=,F3.1,6H X*Y=,F3.1,4H N=,I2,6H SUM=,E10.4)
STOP
END
白色结束
第八章 子程序
语句函数必须用一条语句内完成。复杂的函数和计算就无法完成。
例如:
就无法用简单的语句函数完成
同时,语句函数只得到一个函数值
只能在本程序块中使用
所以需要子程序。
子程序有两种:函数子程序,子例子程序
函数子程序
函数子程序的规则
1、函数子程序必须以FUNCTION语句为第一条语句。表示从该句起是函数子程序。
FUNCTION F(x1,x2,x3,….)
F为函数子程序名,遵循I-N规则。
FUNCTION F(x1,x2,x3,….)
INTEGER F 标准FORTRAN不允许
x1,x2,x3….. 虚拟自变量,也可以是数组
FUNCTION F(x1,x2,x3,….)
INTEGER x1
REAL X2(10)
2、函数子程序最后一行必须是END ,表示子程序到此结束。
3、在函数子程序中,至少要有一个RETURN语句,表示在该处返回主程序的调用处。
4、在子程序中函数名至少被赋值一次。
FUNCTION F(x1,x2,x3,….)
IF(X1.LE.0)THEN
F=1+x1
RETURN
ELSE
F=1+X1*X1
RETURN
ENDIF
END
5、其他规则和一般程序相同。
6、可调用其他函数子程序、子例子程序,不能调用和变相调用自己。可以有自己的函数。
7、函数子程序放在程序源文件的任意地方,或以独立文件方式存放,编译时连在一体。
函数子程序的调用
函数子程序有函数和子程序的双重特点。
以函数的形式调用;有独立的功能、可以有输入输出、独立的变量、数组等;得到不止一个返回值。
M=10
X1=F(M)
X2=2.0*F (10)+10.0
WRITE(*,*)X1,X2
STOP
END
FUNCTION F(N)
F=1.0
DO 10 I=1,N
10 F=F*I
RETURN
END
1、函数子程序不仅可以有函数名带回函数值,还可以通过函数子程序的调用过程中,虚实变量的结合带回附带的数值。
什么意思?
核心一点,可以理解为:虚实变量之间值是双向传递的。
在调用开始从主程序将值传递给子程序中的变量。
在调用结束从子程序将值传递给主程序中的变量。
2、调用时变量之间虚实结合,按位置一一对应,不按名称对应。
注意:变量之间类型对应
数组的类型、大小对应。
有些版本
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
太不严格,要是还不出错,
一旦出错这种错误很难发现。
3、注意子程序中改变虚拟变量值要特别小心。特别主程序中的循环变量等值在调用完后小心改变。
例如:
DO I=1, 5, 1
X=T(I)
WRITE(*,*)X,I
ENDDO
STOP
END
FUNCTION T(K)
T=2*K
K=3*K
RETURN
END
结果:
2.000000 3
8.000000 12
26.00000 39
80.00000 120
242.0000 363
例如:
C==============================================C
C Test array translation between main program and C
C subroutine C
C==============================================C
DIMENSION A(5) ,B(10)
N=10
DO I=1,8
A(I)=I
ENDDO
WRITE(*,*) A
X= TT(A,N) 调用FUNCTION TT
WRITE(*,*)’X=’,X
WRITE(*,*) A
STOP
END
FUNCTION TT(B,M)
DIMENSION B(M)
DO I=1,10
B(I)=2.*B(I)
ENDDO
WRITE(*,*)
WRITE(*,*) B
TT=1.0
RETURN
END
结果:(有些系统出错不能运行,有些系统居然能运行)
1.000000 2.000000 3.000000 4.000000 5.000000
2.000000 4.000000 6.000000 8.000000 10.00000
12.00000 14.00000 16.00000 0.00E+00 0.00E+00
2.000000 4.000000 6.000000 8.000000 10.00000
作业2 运行以上程序,如果不能运行请改正。
子例子程序
1、子例子程序必须以SUBROUTINE语句为第一条语句。表示从该句起是子例子程序。
SUBROUTINE SUB1(X1,X2,….)
子程序名为 SUB1
X1,X2,。。。。是虚拟自变量
注意:子例子程序可以无参数
2、最后一句为END,表示结束。
3、至少有一个RETURN从此返回。
4、可调有其他任意子程序,除自己之外。
5、无返回值,所以子程序中不能给函数名输值。
6、变量之间传递 按位置双向一一对应传递,所以全部传递数据靠虚实变量结合传递。
7、调用过程
CALL SUB1(A,B,C)
作业3
有一10 X 10 的数组,找出数组中每一行中最大元素的位置。
找最大元素用子程序。再找出最大元素的位置。
白色开始
C=============================================C
C ARRAY MAX POSITION C
C=============================================C
DIMENSION A(10,10)
OPEN(15,FILE='T.DAT')
DO I=1,10
READ(15,*)(A(I,J),J=1,10)
ENDDO
DO I=1,10
WRITE(*,10)(A(I,J),J=1,10)
ENDDO
WRITE(*,*)
B=A(1,1)
N1=1
L1=1
DO I=1,10
CALL M(A,I,N)
IF(A(I,N).GT.B) THEN
B=A(I,N)
N1=I
L1=N
ENDIF
WRITE(*,20)I,N
ENDDO
WRITE(*,*)
WRITE(*,30)N1,L1
10 FORMAT(2X,10F7.2)
20 FORMAT( 'The max of the',I3,'th line is the',I3,'th')
30 FORMAT( 'The max of this araay is',I3,'th line ',I3,'th colume')
STOP
END
SUBROUTINE M(A,K,N)
DIMENSION A(10,10)
N=1
DO I=1,10
IF(A(K,I).GT.A(K,N)) N=I
ENDDO
RETURN
END
白色结束
可调数组
DIMENSION 是定义语句必须放在执行语句前,如果用
DIMENSION A( N, M )定义数组大小,则N,M在此之前必须有确定的值。所以不可能实现。
在子程序中(函数子程序和子例子程序)可以做到。N,M的值可以靠传递而得到,所以子程序中可以定义可调数组。
例如:
READ(*,*)K
C
WRITE(*,*) K,TT(K,M),M
X=TT(K,M)
WRITE(*,*)' 个数,最大数,位置'
WRITE(*,10) K,X,M
10 FORMAT(2X,I3,F10.3,I3)
END
FUNCTION TT(N,M)
DIMENSION A(N)
T=-1E34
M=1
READ(*,*) A
DO I=1,N
IF(A(I).GT.T)THEN
T=A(I)
M=I
ENDIF
ENDDO
TT=T
RETURN
END
双精度数、复数
双精度
DOUBLE PRECISION A,BC,NM,X
X=1.0D3
FORMAT(2X,5D18.9) 只有D格式。
大小范围不变,只是精度增加,4个存储单元。
复数
COMPLEX A,BC,NM
输值
程序中
A=(10,20)表示常数赋值 A=10+ 20 i、(错)
READ输入两个实数,第一个为实部,第二个为虚部。
READ(*,*)A,X
输入 1,2,3,4 不出现i
则 A=1+2 i X=3+4 i
输出也是两个实数,第一个为实部,第二个为虚部。
WRITE(*,*)A,X
结果为 1,2,3,4 不出现i
如果想出现i,可用格式输出
WRITE(*,10)A,X
10 FOEMAT(2X,2(F0.4, 1H+,F10.4,1Hi))
结果为 1.000+2.0000 i 3.0000+4.0000 i
表达式写法
复数的算术运算全部可以进行,格式写法不变。
以上形式在程序中都可用。
(1+2*i)*(3+4*i)
若i为整型或实型变量时,该式表示四个复数,加后成为两个复数,再相乘。
当i为复型变量时,该式表示四个复数,加后成为两个复数,再相乘。
还可以直接写成两个复数相乘,写成:(1,2)*(3,4)
运算后仍为复数。
几个函数
1、组合函数 CMPLX
x1=10,x2=20
A=( 10, 20 ) 正确
A=(x1,x2)不行
A=CMPLX(x1,x2) 正确
A=CMPLX(10*X1, X2+20) 正确
A=CMPLX(3) 正确
2、REAL(C) 取实部 FLOAT(I),INT(R)
3、AIMAG(C)取虚部
4、ABS(C) 求模:
SQRT(REAL(C)* REAL(C)+ AIMAG(C)* AIMAG(C))
等价语句
定义格式:
EQUIVALENCE (变量列表1),(变量列表2),。。。。
变量公用一个存储单元,
不仅仅是值相同,
同一程序块中适用。
例如 EQUIVALENCE (X1,A,FGH),(I1,NM,KLJ)
X1,A,FGH 公用一个存储单元
I1,NM,KLJ 公用一个存储单元
注意: 类型要相同,改变一个变量的值,其他几个当然改变。
数组等价
DIMENSION A(8),B(2,4),C(4,2)
EQUIVALENCE (A,B,C)
4个数组公用8个存储单元,如下:
A(1) A(2) A(3) A(4) A(5) A(6) A(7) A(8)
B(1,1) B(2,1) B(1,2) B(2,2) B(1,3) B(2,3) B(1,4) B(2,4)
C(1,1) C(2,1) C(3,1) C(4,1) C(1,2) C(2,2) C(3,2) C(4,2)
公用语句
无公用区
定义格式:COMMON A1,A2,A3,。。。
在主程序和子程序中同时定义(执行语句前)。
功能:子程序和主程序中位置对应的变量公用一个存储单元。
节省存储单元,程序块之间进行数据传递。
例如:
主程序中:COMMON X,Y,I,Z(3)
子程序中:COMMON A,B,I,T(3)
X和A,Y和B,I和I 分别分配一个存储单元,所以共占三个存储单元。
Z(3)和T(3)数组Z和T共占三个存储单元。 Z(1)和T(1),Z(2)和T(2),Z(3)和T(3)分别各占一个。
注意:Z(3),T(3)不是只让Z(3)和T(3)占一个单元,而是定义了两个数组,同时让各元素公用存储单元。
例如:COMMON A(20),J(2,8)
相当于 DIMENSION A(20),J(2,8)
COMMON A, J 两条语句。
多个无名公用区相当于一个
例如:
COMMON A,B
COMMON C
COMMON D,E
等效于:
COMMON A,B,C,D,E
公用区中的变量不能相同,
所以无名共用区传递数据和公用受到很大限制。
有名公用区
格式:COMMON /N1/A1,A2,A3 /N2/ X1,X2,X3
主程序,子程序中都应该有,不同公用区中的变量可以相同。
功能:定义了名字为N1的共用区,其中有变量A1,A2,A3
名字为N2的共用区,其中有变量X1,X2,X3
不同程序块之间可以按照名称不同有选择的公用。
例如:
主程序中
COMMON /N1/A1,A2,A3 /N2/ X1,X2,X3
子程序1
COMMON /N2/ X1,X2,X3
子程序2
COMMON /N1/A1,A2,A3 /N2/ X1,X2,X3
子程序3
COMMON /N1/A1,A2,A3
DATA语句
格式:DATA A/2.0/,C/4.5/,WER/0.9/
或写成: DATA A,B,WER/ 2.0,4.5,0.9/
放在说明语句之后。
数组 REAL A(5)
DATA A / 2.0,2.0,2.0,2.0,2.0/ 非标准
或 DATA A / 5* 2.0 /
_1237704758.unknown
_1238217614.unknown
_1238858634.unknown
_1238875707.unknown
_1238225951.unknown
_1238185006.unknown
_1237665300.unknown