2017-12-07 3 views
0

: 나는 다음과 같은 형식으로 인쇄 할 수 있도록하려면인쇄 낮은 삼각 포장 매트릭스 나는 포장 낮은 삼각 행렬로 배열에 저장된 실제 * 8 개 숫자의 행렬이 77

|1 * * * * *| 
|2 7 * * * *| 
|3 8 12 * * *| 
|4 9 13 16 * *| => [1,2,3,4,5,6,7,8,9...21] 
|5 10 14 17 19 *| 
|6 11 15 18 20 21| 

을 :

[row|col] 1 2 3 4 5 
    1  1 * * * * 
    2  2 7 * * * 
    3  3 8 12 * * 
    4  4 9 13 16 * 
    5  5 10 14 17 19 
    6  6 11 15 18 20 

[row|col] 6 
    1  * 
    2  * 
    3  * 
    4  * 
    5  * 
    6  6 

내가 가진 문제는 내가 모르는 얼마나 열별로 요소를 저장하고 인쇄하려면 별도의 배열을 생성 할 필요없이 행렬 요소로 루프. 이것은 지금까지 시도한 것입니다.

 Implicit Real*8 (A-H,O-Z) 


     INTEGER  ARRAY(21) 



     10 Format(5X,'[Row|Col]',5(8X,I6)) 
     Icol=6 
     Num1=1 
C  Test array 
     DO K=1,21 
     Array(K)=K*1.0d0 
     ENDO 

C  Print the elements row-by-row.  
44 Num2=Icol-Num1 
     Num=Num2 
     If ((Num2).gt.5) Num=5 
     Write(*,10) (I,I=Num1,Num1+Num) 
     INum1=INum1+Num 
     if (Inum1.ne.Icol) goto 44  
     STOP 
     END 
+0

여섯 번째 열이 첫 번째 열과 분리되어 있습니까? – Galen

+0

예. 출력에 문제없이 맞출 수 있도록 그 당시 5 개의 열을 인쇄하고 싶습니다. – user3671704

+0

자세한 내용을 보려면 모든 [Fortran] 질문에 [tag : fortran]을 사용하십시오. 또한 yur 코드에서 일부 indentetion을 사용하여 읽을 수있게 만들고, 2017 년에 Fortran의 사전 버전이 아닌 버전을 사용하는 것을 고려하십시오. 유우 쇼의 코드에는 'ENDO'와 같은 구문 오류가 없습니다. ** 실제 코드 ** [mcve]를 보여 주셔야합니다. –

답변

1

키는 낮은 삼각형 행렬의 0이 아닌 요소를 지정하는 수식을 식별하는 것입니다. i와 j가 각각 행과 열에 대한 인덱스를 실행하는 경우 요소 (j < i)는 아래 삼각형 부분에 있습니다. 여기에 코드입니다 :

PROGRAM print_low_tri_matrix 
IMPLICIT NONE 
INTEGER :: i,j,n,m,p 
REAL ,ALLOCATABLE, DIMENSION(:,:) :: a 
REAL, ALLOCATABLE, DIMENSION(:) :: r 

n = 6 
p = n*(n+1)/2 ! Number of non-zero elements in a lower triangular matrix of size n by n 

ALLOCATE(a(n,n),r(p)) 

DO i = 1, p 
     r(i) = i*1.0 ! Array containing the non-zero elements 
END DO 

m = 1   ! Index tracking the non-zero elements array r 
DO j = 1,n 
     DO i = 1,n 
       IF(j .LE. i) THEN  ! Non-zero indices of the matrix 
         a(i,j) = r(m) 
         m = m + 1 
       ELSE 
         a(i,j) = 0. 
       END IF 
     END DO 
END DO 


!  Printing the full matrix a - uncomment for checking 
!   DO i = 1,n 
!       WRITE(*,*) (a(i,j),j=1,n) 
!   END DO 


!  Printing the matrix a as needed 
DO i = 1,n 
     DO j = 1,n 
       IF(j .LE. i) THEN 
         WRITE(*,'(F12.4)',ADVANCE="NO") a(i,j) 
       ELSE 
         WRITE(*,'(A12)',ADVANCE="NO") '*' 
       END IF 

       IF (j .EQ. n) WRITE(*,*) 
     END DO 
END DO 

END PROGRAM print_low_tri_matrix 

그리고 출력은 다음과 같습니다 당신이 원하는 경우 물론

1.0000   *   *   *   *   * 
2.0000  7.0000   *   *   *   * 
3.0000  8.0000  12.0000   *   *   * 
4.0000  9.0000  13.0000  16.0000   *   * 
5.0000  10.0000  14.0000  17.0000  19.0000   * 
6.0000  11.0000  15.0000  18.0000  20.0000  21.0000 

, 당신은 정수 배열로 행렬을 변경할 수 있습니다.

P.S : - f77에서이 작업을 수행하려면 WRITE(*,'(F12.4)',ADVANCE="NO") a(i,j)에서 WRITE(*,'(F12.4,$)') a(i,j)으로 형식 지정자를 변경할 수 있습니다. 배열의 할당은 직접 제거하고 정의해야합니다.

+0

OP가 Fortran 77을 요구했는데, 나는 그것이 실제로 필요하다고 생각합니다. 그러나 코드가 F77을 준수하지 않는다는 점은 주목할 가치가 있습니다. – Ross

+0

@ 로스, 네, 맞습니다. 나는 그것을 f77 표준으로 만드는 것을 잊었다. 그러나 OP가이를 적절하게 수정할 수 있기를 바랍니다. 나는 대답에 메모를 추가 할 것이다. –

+1

불필요하게 F77과 호환되도록 write 문과 동적 할당을 변경하는 것보다 더 많은 일을해야합니다. 그리고'$'편집은 어쨌든 F77이 아닙니다. – francescalus