这是程序。其实质如下。有两个维度为2到3的数组。我需要根据过滤器E_max找到所有可能的总和和产品组合。你能否告诉我如何编写更紧凑的嵌套循环,即如果我有10列不绘制10个嵌套循环?请帮帮我。
program f_
implicit none
integer E_max, i, j, k, i1, j1, k1, l
real f1, f2, oldp, oldp1, oldp2, oldp_1, oldp_2, p1, p2, p3, p
real(8), allocatable, dimension(:, :) :: F, ener
real(8), allocatable, dimension(:) :: E_vib, f_1
allocate (F(2,3), E_vib(3), f_1(3), ener(2,3))
open( unit=10, file= 'File.txt', status='old')
do j = 1, 2
read(10,*) (f(j,k),k=1,3)
end do
201 j=j-1
close(unit=10, status='keep')
003 format(f25.20,1x,\)
open( unit=10, file= 'fileen.txt', status='old')
do j = 1, 2
read(10,*) (ener(j,k),k=1,3)
end do
205 j=j-1
close(unit=10, status='keep')
004 format(f25.20,1x,\)
E_max = 4
do i = 1, 2
oldp = ener(i,1)
p1 = f(i,1)
if (oldp > E_max) then
goto 1
end if
1 continue
do j = 1, 2
oldp1 = ener(j,2)
p2 = f(j,2)
if (oldp1 + oldp > E_max) then
goto 2
end if
2 continue
do k = 1, 2
oldp2 = ener(k,3)
p3 = f(k,3)
if (oldp2 + oldp1 + oldp > E_max) then
goto 5
end if
oldp_1 = oldp + oldp1 + oldp2
p = p1*p2*p3
write (*,*) 'i=', i , 'j=', j,'k=', k, oldp_1, p
5 continue
end do
end do
end do
deallocate (F, E_vib, f_1, ener)
end program
答案 0 :(得分:1)
这可能更像是一个扩展的评论,而不是一个答案,但现在就是这样。
要使程序更紧凑,你可以做的一件事就是仔细考虑块的逻辑,例如
if (oldp1 + oldp > E_max) then
goto 2
end if
2 continue
这段代码对程序没有任何影响,可以删除而不会产生任何影响。一个非常聪明的编译器可能已经为你做了这件事,但是,如果你没有这样的智能编译器,你可以通过自己删除代码来帮助它。
在其他地方,程序的逻辑很难遵循,说实话,我已经放弃了。帮自己一个忙,用他们现代的等价物替换程序中的所有goto
(想想exit
,思考cycle
),消除所有continue
语句(想想{{ 1}})。一旦你完成了所有这些,就有可能找出问题的答案。