2014-11-20 5 views
0

이것은 프로그램입니다. 그 본질은 다음과 같습니다. 차원 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

http://www.drdobbs.com/jvm/programming-with-reason-why-is-goto-bad/228200966 – user1824346

답변

1

이것은 대답보다 확장 된 의견 일 가능성이 높지만 여기에 있습니다. 당신은 당신의 프로그램이 더 컴팩트하게 할 수

한 가지주의 깊게 같은

if (oldp1 + oldp > E_max) then 
    goto 2 
    end if 
    2 continue 

이 코드 블록은 프로그램에 정확하게 영향을주지 않습니다 어떤없이 삭제 될 수 블록의 논리에 대해 생각하는 것입니다 효과. 정말 똑똑한 컴파일러가 이미 그렇게하고 있을지 모르지만, 똑똑한 컴파일러가없는 경우에는 코드를 직접 삭제하면됩니다.

프로그램의 논리가 따르기가 매우 어려운 다른 곳이 있으며, 솔직히 말해서 나는 포기했습니다. 프로그램의 goto을 모두 현대의 동등한 것으로 바꾸고 (exit라고 생각하고 cycle라고 생각하면) continue 문을 모두 삭제하십시오 (end으로 생각하십시오). 일단 모든 것을 다 열면 질문 한 질문에 대한 답을 알아낼 수 있습니다.

+0

대단히 감사합니다. 나는이 문제를 해결하려고 노력할 것이라고 생각했다. – Afino4ka