2015-01-24 7 views
-1

혼동 루프를 계속 수행 한 후 나는 이러한 코드 발견포트란 내가 C++ 버전으로 포트란 프로그램을 번역하기 위해 노력하고있어

100 DO 120 I=2,7 
    DO 110 J=1,3 
    IF(IU(J)/I*I-IU(J))120,110,120 
110 CONTINUE 
    GO TO 130 
120 CONTINUE 
    GO TO 150 
130 DO 140 J=1,3 
140 IU(J)=IU(J)/I 
    GO TO 100 
150 CONTINUE 
    END 

그리고 END은 끝입니다.

bool flag=true; 

while(flag){ 
    flag=false; 
    for (int i = 2; i <= 7; i++) { 
     for (int j = 0; j < 3; j++) { 
      if ((IU[j]/i*i==IU[j])) { 
       flag=true; break; 
      } 
      else { 
       continue; 
      } 
     } 
     if (!flag) { 
      break; 
     } 
     else { 
      for (int j = 0; j < 3; j++) { 
       IU[j]=IU[j]/i; 
      } 
     } 
    } 
} 

내가 잘못임을 확신하지만, 올바른 일을 알아낼 수 :

내 C++의적인 버전입니다. 그렇다면 포트란 코드를 C++로 변환하는 방법은 무엇입니까?

+0

https://xkcd.com/292/ – CoryKramer

+0

F2C를 사용해보십시오, 당신의 정신을 절약 할 수 – Anycorn

+2

먼저 순서도를 그립니다. f2c는 결코 읽을 수있는 코드를 생성하는데있어서 결코 좋았지 만, 나는 그것이 누군가의 온전함을 어떻게 보존 할 수 있는지를 볼 수 없다. –

답변

1

가장 중요한 것은 코드가하는 것을 이해하는 것입니다.

이 코드는 더러운 코드처럼 보입니다. 그러나 더 자세히 분석하면 코드가 무엇을하는지 명확히 알 수 있습니다. iu의 값을 i로 나눕니다. 2에서 7까지의 값은 모든 값이 나는.

일부 작품은 비 소수로 나눠서 낭비됩니다.

왜 7시에 끝나는 지 스스로에게 물어보십시오. 이것은 수십 년 전에 작은 메모리 크기로 인해 하드 코드 된 한계 일 수 있습니다.

여기는 C로 된 버전입니다 (테스트되지 않았고 들여 쓰기가 엉망입니다).

#define NIU 3 
#define NDIVISORS 4 

void foo(int *iu) 
{ 
    int i,j; 

    static int divisors[NDIVISORS] = {2, 3, 5, 7}; 

    for (i=0; i<NDIVISORS;i++) 
    { 
     int has_divisor = 1; 
     while (has_divisor) 
    { 
     for (j=0; j<NIU; j++) 
     { 
      if (iu[j] % divisors[i] != 0) 
     { 
      has_divisor = 0; 
      break; 
     } 
     } 
     if (has_divisor) 
     { 
      for (j=0; j<NIU; j++) 
     iu[j] = iu[j]/i; 
     } 
    } 
    } 
} 

그리고 여기가 (알고리즘 명확하게하기 위해) 현대 포트란 버전입니다 :

subroutine foo(iu) 
    implicit none 
    integer, dimension(3), intent(inout) :: iu 
    integer, dimension(4), parameter :: divisors = [2, 3, 5, 7] 
    integer :: i 

    do i=1, size(divisors) 
    do while (all(mod(iu, divisors(i)) == 0)) 
     iu = iu/divisors(i) 
    end do 
    end do 
end subroutine foo