西安交大Fortran上机作业4

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

工程分析程序设计上机作业(四)
数组
上机目的:练习数组的声明、存储、操作,以及数组参数、动态数组的使用。

1、请声明一个大小为10的一维数组,它们的初值为A(1)=2, A(2)=4, A(3)=6, ……A(I)=2*I,
并计算数组中这10个数字的平均值。

PROGRAM MAIN
IMPLICIT NONE
INTEGER A(10)
INTEGER I,ANS,P
ANS=0
DO I=1,10
A(I)=2*I
END DO
DO I=1,10
WRITE(*,"('A','(',I2,')= ',I2)"),I,A(I)
END DO
DO I=1,10
ANS=ANS+A(I)
END DO
P=ANS/10.0
PRINT*,'AVERAGE=',P
END
2、编写一个程序来计算费氏数列的前10项,并把它们按顺序保存在一个一维数组当中。

费氏数列(Fibonacci Sequence)的数列规则如下:
F(0)=0
F(1)=1
当n>1时
F(n)=f(n-1)+f(n-2)
PROGRAM MAIN
IMPLICIT NONE
INTEGER F(0:9)
INTEGER I
DATA (F(I),I=0,1) /0,1/
DO I=2,9
F(I)=F(I-1)+F(I-2)
END DO
WRITE(*,"('F','(',I2,') =',I2)"),I,F(I)
END
PROGRAM MAIN
IMPLICIT NONE
INTEGER F(0:9)
INTEGER I
DATA (F(I),I=0,1) /0,1/
DO I=2,9
F(I)=F(I-1)+F(I-2)
END DO
PRINT*,F
END
3、输入任意n个数存放在数组中(如5个数1、2、8、2、10),请在屏幕上打印如下方阵
1 2 8 2 10
10 1 2 8 2
2 10 1 2 8
8 2 10 1 2
2 8 2 10 1
PROGRAM MAIN
IMPLICIT NONE
INTEGER A(5,5),B(5,5)
INTEGER I,J,T
A(1,:)=(/1,2,8,2,10/)
DO I=2,5
DO J=2,5
T=A(I-1,5)
A(I,J)=A(I-1,J-1)
A(I,1)=T
END DO
END DO
DO I=1,5
DO J=1,5
B(J,I)=A(I,J)
END DO
END DO
WRITE(*,10)B
10 FORMA T(1X,5I4)
END
4、打印杨辉三角形,打印的行数由键盘输入。

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
PROGRAM MAIN
IMPLICIT NONE
INTEGER,ALLOCA TABLE::A(:,:),B(:,:) INTEGER I,J,N
PRINT*,'PLEASE INPUT N'
READ*, N
ALLOCATE(A(N,N))
ALLOCATE(B(N,N))
A(1,1)=1
DO I=2,N
DO J=2,N-1
A(I,J)=A(I-1,J-1)+A(I-1,J)
A(I,1)=1;A(I,I)=1
END DO
END DO
DO I=1,N
DO J=1,N
B(J,I)=A(I,J)
END DO
END DO
WRITE(*,10)B
10 FORMA T(1X,<N>I4)
DEALLOCATE(A,B)
END
5、用“冒泡算法”对一个数列A(n)进行排序:
若要排序的数有n个,则需要n-1轮排序。

第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第n-j个数为止,第一个数与第二个数比较,第二个数与第三个数比较,......,第n-j-1个与第n-j个比较,共比较n-1次。

此时第n-j个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。

例如:第一轮排序:第一个数与第二个数进行比较,若不符合要求的顺序,则交换两者的位置,否则继续进行二个数与第三个数比较......。

直到完成第n-1个数与第n个数的比较。

此时第n个位置上的数已经按要求排好,它不参与以后的比较和交换操作;第二轮排序:第一个数与第二个数进行比较,......直到完成第n-2个数与第n-1个数的比较;......第n-1轮排序:第一个数与第二个数进行比较,若符合所要求的顺序,则结束冒泡法排序;若不符合要求的顺序,则交换两者的位置,然后结束冒泡法排序。

共n-1轮排序处理,第j轮进行n-j次比较。

算法描述:
如果共有n个数:
第1个数要进行n-1次两两比较
第2个数要进行n-2次两两比较
第j个数要进行n-j次两两比较,j=1, n-j
n个数总共要进行n-1次排序
DO I = 1, N-1
DO J = 1, N-J
如果A(J) > A(J+1) 交换A(J) 和A(J+1) END DO
END DO
PROGRAM MAIN
IMPLICIT NONE
INTEGER,ALLOCA TABLE::A(:)
INTEGER I,J,N,T
PRINT*,"PLEASE INPUT N"
READ*,N
DO I=1,N
PRINT*,I
READ*,A(I)
END DO
DO I=1,N-1
DO J=1,N-I
IF(A(J)>A(J+1)) THEN
T=A(J)
A(J)=A(J+1)
A(J+1)=T
END IF
END DO
END DO
PRINT*,A
END
PROGRAM MAIN
IMPLICIT NONE
INTEGER,PARAMETER::X=7
INTEGER::A(X)=(/2,8,6,3,4,7,9/)
INTEGER::I,J
INTEGER::K
DO I=1,X-1
DO J=1,X-I
IF(A(J)>A(J+1)) THEN
K=A(J)
A(J)=A(J+1)
A(J+1)=K
END IF
END DO
END DO
WRITE(*,"(10I4)")A
END
6、从A、B两个数列中,把同时出现在两个数列中的数据删去。

例如:
A:2 5 5 8 9 12 18
B:5 8 12 12 14
操作完成后:
A:2 9 18
B:14
PROGRAM MAIN
IMPLICIT NONE
INTEGER::A(7)=(/2,5,5,8,9,12,18/)
INTEGER::B(5)=(/5,8,12,12,14/)
INTEGER I,J,M
PRINT*,'A:'
DO I=1,7
DO J=1,5
IF(A(I)==B(J)) GOTO 1
END DO PRINT*,A(I) 1 CONTINUE END DO
PRINT*,'B:' DO J=1,5 DO I=1,7 IF(A(I)==B(J)) GOTO 2 END DO PRINT*,B(J) 2 CONTINUE END DO END
7、 高斯消去法求解线性代数方程组:对于一般的n 阶方程组,
⎪⎪⎩⎪⎪⎨
⎧=+++=+++=+++n
n nn n n n n n n b x a x a x a b x a x a x a b x a x a x a 22112222212111212111.....................................................
高斯消去法步骤如下:第一步:若011≠a ,令n i a a l i i ,...,3,2,/1111==,用()1i l -乘第1个方程加到第i 个方程上()n i ,...,3,2=,得同解方程组
(1)(1)(1)(1)11112211(2)(2)(2)
22222(2)(2)(2)22...................................n n n n n nn n n a x a x a x b a x a x b a x a x b ⎧+++=⎪++=⎪⎨
⎪⎪++=⎩
其中 .,,3,2,,,,3,2,,,,,,3,2,1,11)
2(11)2(1)1(11)1(1n i b l b b n j i a l a a b b n j a a i i i j i ij ij j j =-==-==== 第二步:若,0)2(22≠a 令n i a a l i i ,,4,3,/)
2(22)2(22 ==,用)(2i l -乘第2个方程加到第i 个方程上
),,4,3(n i =,则将),,4,3()
2(2
n i a i =消去。

一般,设第k-1步后方程组化为如下的同解方程组 (1)(1)(1)(1)
11112211(2)(2)(2)
22222
()()
()()()()
............................................................................n n n n k k k kk k kn n k k k k nk n nn n n a x a x a x b a x a x b a x a x b a x a x b ⎧+++=⎪++=⎪⎪⎪⎨++=⎪
⎪⎪
⎪++=⎩
则第k 步:若若,0)(≠k kk a 令n k k i a a l k kk k ik ik ,,2,1,/)()( ++==,用)(ik l -乘第k 个方程加到第i
个方程上(,,,2,1n k k i ++=),得到如下的同解方程组
⎪⎪⎪⎪
⎪⎩
⎪⎪⎪⎪⎪⎨⎧=++=++=++=++=++++++++++++++++)
1()1(1)1(1,)
1(1)1(,11)1(1,1)
()()()
2(2
)2(22)2(22)1(1)1(12)1(121)1(11............................................................................k n n k nn k k k n k k n k n k k k k k k k
n k kn k k kk n n n n b x a x a b x a x a b x a x a b x a x a b x a x a x a 其中(1)()()(1)()(),.1,,,,1,
,k k k ij ij ik kj k k k i i ik k a a l a i j k n b b l b i k n
++⎧=-=+⎪⎨=-=+⎪⎩ 按上述做法,做完n-1步,原方程组化为同解的上三角形方程组
⎪⎪
⎪⎪

⎪⎪⎪⎪⎨⎧==++=++=+++)
()()()
()()
2(2
)2(22)2(22)
1(1)1(12)1(121)1(11....................................................................n n n n nn k k n k kn k k kk n n n n b x a b x a x a b x a x a b x a x a x a 最后,设0)
(≠n nn
a ,逐步代回得原方程组的解()()
()()1/,()/(1,2,,2,1).n n n n nn n
k k k
k k
kj j kk j k x b a x b a x a k n n =+⎧=⎪⎪=-⎨⎪
⎪=--⎩

注意:上述公式中)()
(,k i k ij b a 的上标k ,是用来区别消去过程中第k 步利用的量。

在用编程求解
时,可把)(k ij a 存在ij a 位置,)(k i b 存在i b 位置。

解方程组(1)⎪⎩⎪⎨⎧-=++-=-+=++3
11874351
321321
3
21321x x x x x x x x x (2)⎩⎨⎧=+=+-232121021215x x x x 此方程病态,提示:列主元消去法,第k 步
消去过程选取第k 行绝对值最大元素a kq ,交
换k 和q 列,然后继续消去过程
PROGRAM MAIN
IMPLICIT NONE
REAL::A(3,4)=(/1,5,7,2,1,8,3,-3,11,1,-4,-3/) INTEGER I,N,J
REAL M,L
REAL X1,X2,X3
IF(A(1,1)/=0)THEN
DO I=2,3
L=A(I,1)/A(1,1)
DO N=1,4
A(I,N)=A(I,N)-L*A(1,N)
END DO
END DO
END IF
IF(A(2,2)/=0) THEN
M=A(3,2)/A(2,2)
DO J=2,4
A(3,J)=A(3,J)-M*A(2,J)
END DO
END IF
X3=A(3,4)/A(3,3)
X2=(A(2,4)-X3*A(2,3))/A(2,2)
X1=(A(1,4)-X3*A(1,3)-X2*A(1,2))/A(1,1) PRINT*,X1,X2,X3
END
PROGRAM MAIN
IMPLICIT NONE
REAL::A(2,3)=(/0.00001,2.0,2.0,3.0,1.0,2.0/) REAL L
INTEGER I,M
REAL X1,X2
IF(A(1,2)>A(1,1))THEN
L=A(2,2)/A(1,2)
DO M=1,3
A(2,M)=A(2,M)-L*A(1,M)
END DO
END IF
X1=A(2,3)/A(2,1)
X2=(A(1,3)-A(1,1)*X1)/A(1,2)
PRINT*,X1,X2
END
PROGRAM MAIN
IMPLICIT NONE
INTEGER,ALLOCA TABLE::A(:,:),B(:,:) INTEGER(2) I,J,N,T
PRINT*,'NUMBER'
READ*,N
ALLOCATE(A(N,N))
PRINT*,'NUMBER'
READ*,A(1,:)
PRINT*,A
DO I=2,N
DO J=2,N
T=A(I-1,N)
A(I,J)=A(I-1,J-1)
A(I,1)=T
END DO
END DO
DO I=1,N
DO J=1,N
B(J,I)=A(I,J)
END DO
END DO
WRITE(*,10)B
10 FORMAT(1X,5I4)
DEALLOCATE(A)
DEALLOCATE(B)
END
选作:
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
5×5的魔方阵:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减
1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。

例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
试打印出奇数阶魔方阵。

相关文档
最新文档