fortran习题3答案.docx
《fortran习题3答案.docx》由会员分享,可在线阅读,更多相关《fortran习题3答案.docx(15页珍藏版)》请在冰点文库上搜索。
![fortran习题3答案.docx](https://file1.bingdoc.com/fileroot1/2023-5/15/22b31049-00d2-4468-a19f-fb37f78a0f80/22b31049-00d2-4468-a19f-fb37f78a0f801.gif)
fortran习题3答案
工程分析程序设计上机作业(四)
数组
上机目的:
练习数组的声明、存储、操作,以及数组参数、动态数组的使用。
1、请声明一个大小为10的一维数组,它们的初值为A
(1)=2,A
(2)=4,A(3)=6,……A(I)=2*I,并计算数组中这10个数字的平均值。
programmain
implicitnone
integerA(10)
integeri,sum
sum=0
doi=1,10
A(i)=2*i
sum=sum+A(i)
enddo
print*,'Theaverageofthetennumbersis:
',sum/10.
end
2、编写一个程序来计算费氏数列的前10项,并把它们按顺序保存在一个一维数组当中。
费氏数列(FibonacciSequence)的数列规则如下:
F(0)=0
F
(1)=1
当n>1时
F(n)=f(n-1)+f(n-2)
programmain
implicitnone
integeri
integer
(2)A(11)
A
(1)=0;A
(2)=1
doi=3,11
A(i)=A(i-1)+A(i-2)
enddo
print*,A(2:
11)
End
3、输入任意n个数存放在数组中(如5个数1、2、8、2、10),请在屏幕上打印如下方阵
128210
101282
210128
821012
282101
programmain
implicitnone
integer,allocatable:
:
A(:
)
integer
(2)i,j,n,temp
print*,'请输入数字的个数:
'
read*,n
allocate(A(n))
print*,'请输入数字:
'
read*,A(1:
n)
print*,A
doi=2,n
temp=A
(1)
doj=1,n-1
A(j)=A(j+1)
enddo
A(n)=temp
print*,A
enddo
deallocate(A)
end
4、打印杨辉三角形,打印的行数由键盘输入。
1
11
121
1331
14641
programmain
implicitnone
integer
(2),allocatable:
:
A(:
:
)
integeri,j,n
print*,'请输入要打印的行数:
'
read*,n
allocate(A(n,n))
doi=1,n
A(i,1)=1;A(i,i)=1
enddo
if(n>=2)then
doi=1,n-1
doj=1,i
A(i+1,j+1)=A(i,j)+A(i,j+1)
enddo
enddo
endif
doi=1,n
print*,A(i,1:
i)
enddo
deallocate(A)
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次排序
DOI=1,N-1
DOJ=1,N-J
如果A(J)>A(J+1)交换A(J)和A(J+1)
ENDDO
ENDDO
programmain
implicitnone
integer,allocatable:
:
A(:
)
integer
(2)i,j,k,n,temp
print*,'请输入数字的个数:
'
read*,n
allocate(A(n))
print*,'请输入数字:
'
read*,A(1:
n)
doi=1,n-1
doj=1,n-1
if(A(j)>A(j+1))then
temp=A(j)
A(j)=A(j+1)
A(j+1)=temp
endif
enddo
enddo
print*,A
deallocate(A)
end
6、从A、B两个数列中,把同时出现在两个数列中的数据删去。
例如:
A:
255891218
B:
58121214
操作完成后:
A:
2918
B:
14
programmain
implicitnone
integer
(2)A(7),B(5),Temp(7)
externalSub
dataA/2,5,5,8,9,12,18/
dataB/5,8,12,12,14/
integerm,n
Temp=A
print*,'删去相同的数后:
'
print*,'A'
callSub(Temp,B,7,5)
print*,'B'
callSub(B,A,5,7)
end
subroutineSub(C,D,m,n)
integer
(2)C(m),D(n)
integeri,j,k,m,n,p
p=m
10doi=1,p
doj=1,n
if(C(i)==D(j))then
dok=i,p-1
C(k)=C(k+1)
enddo
p=p-1
goto10
endif
enddo
enddo
print*,C(1:
p)
endsubroutine
7、高斯消去法求解线性代数方程组:
对于一般的n阶方程组,
高斯消去法步骤如下:
第一步:
若
,令
,用
乘第1个方程加到第i个方程上
,得同解方程组
其中
第二步:
若
令
,用
乘第2个方程加到第i个方程上
,则将
消去。
一般,设第k-1步后方程组化为如下的同解方程组
则第k步:
若若
令
,用
乘第k个方程加到第i个方程上(
),得到如下的同解方程组
其中
按上述做法,做完n-1步,原方程组化为同解的上三角形方程组
最后,设
,逐步代回得原方程组的解
此方程病态,提示:
列主元消去法,第k步消去过程选取第k行绝对值最大元素akq,交换k和q列,然后继续消去过程
注意:
上述公式中
的上标k,是用来区别消去过程中第k步利用的量。
在用编程求解时,可把
存在
位置,
存在
位置。
解方程组
(1)
(2)
programmain
implicitnone
real,allocatable:
:
A(:
:
)
real,allocatable:
:
X(:
)
integer
(2)i,j,k,n
real(4)m
print*,'请输入方程组所含方程的个数:
'
read*,n
allocate(A(n,n+1))
allocate(X(n))
print*,'请输入方程组的系数矩阵:
'
doi=1,n
read*,A(i,:
)
enddo
dok=1,n-1
doi=k+1,n
A(i,:
)=A(k,:
)*(A(i,k)/A(k,k)*(-1))+A(i,:
)
enddo
enddo
X(n)=A(n,n+1)/A(n,n)
dok=n-1,1,-1
m=0
doi=k+1,n
m=m+A(k,i)*X(i)
enddo
X(k)=(A(k,n+1)-m)/A(k,k)
enddo
doi=1,n
print*,'X(',i,')=',X(i)
enddo
deallocate(A)
deallocate(X)
End
选作:
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
816
357
492
5×5的魔方阵:
17241815
23571416
46132022
101219213
11182529
魔方阵的排列规律如下:
(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的下面;
试打印出奇数阶魔方阵。
programmain
integern,i,x,y
integer
(2),allocatable:
:
a(:
:
)
print*,'请输入魔方的阶数(奇数)'
read*,n
allocate(a(n,n))
a=0;y=(n+1)/2;x=1;a(x,y)=1
doi=2,n*n
if(x==1.and.y==n)then
x=2
else
x=x-1
if(x==0)x=n
y=y+1
if(y==n+1)y=1
if(a(x,y)/=0)then
x=x+1;y=y-1
if(x==n+1)x=1
if(y==0)y=n
x=x+1
endif
endif
a(x,y)=i
enddo
doi=1,n
print*,a(i,1:
n)
enddo
endprogram