      PROGRAM FRT110101
      IMPLICIT NONE 
      INTEGER DIM1, DIM2
      PARAMETER (DIM1=3, DIM2=4)
      INTEGER MAT(DIM1,DIM2), MATRIS(DIM1,DIM2)
	CHARACTER*12 NOMEFILE

C lettura nome del file di input      
	PRINT *, 'NOME FILE DI INPUT?'
      READ *, NOMEFILE
    
C lettura matrice dal file di input      
      CALL LEGGIMATRICE(MAT, DIM1, DIM2 ,NOMEFILE)


C stampa di controllo
	PRINT *, 'MATRICE di partenza'
      CALL STAMPAMATRICE(MAT, DIM1, DIM2)

C uso della subroutine soluzioe e stampa di controllo della matrice prodotta
	CALL SCORRIMENTO (MAT,MATRIS, DIM1, DIM2)
	PRINT *, 'MATRICE ottenuta con lo scorrimento'
      CALL STAMPAMATRICE(MATRIS, DIM1, DIM2)


     	   PRINT *, 'qualcosa per terminare ...'
			   READ *, NOMEFILE
	STOP
      END


C definizione della subroutine SCORRIMENTO (soluzione dell'esercizio proposto)
C MAT1 e' una matric N per M di interi;
C MAT2 e' una matrice analoga, che viene riempita con lo scoriimento di MAT1

      
      SUBROUTINE SCORRIMENTO(MAT1, MAT2, N, M)
      IMPLICIT NONE 
      INTEGER N, M, I, J, MAT1(N,M), MAT2(N,M)

C sistemazione dell'elemento (N,M)
      MAT2(1,1) = MAT1(N,M)

C sistemazione degli elementi rimanenti sulla prima colonna di MAT2
	   DO 10 I=2,N
         MAT2(I,1) = MAT1(I-1,M)
10       CONTINUE

C sistemazione degli elementi interni (questi devono solo spostarsi di uno 
C verso destra sulla stessa riga)

      DO 20 I=1,N
         DO 30 J=2,M
         MAT2(I,J) = MAT1(I, J-1)
  30  CONTINUE
  20  CONTINUE

      RETURN
      END


C definizione della subroutine LEGGIMATRICE
C legge una matrice MAT di dimensione N per M dal file di nome NMF
      SUBROUTINE LEGGIMATRICE(MAT,N, M, NMF)
      IMPLICIT NONE 
      INTEGER I,J,N, M, MAT(N,M)
      CHARACTER*12 NMF
	
	OPEN(9,FILE=NMF)

      DO 40 I=1,N
         READ (9,*) (MAT(I,J), J=1,M)
  40  CONTINUE
	
      CLOSE(9)

      RETURN
      END

C definizione della subroutine STAMPAMATRICE
C stampa una matrice MAT di dimensione N per M su standard output
      SUBROUTINE STAMPAMATRICE(MAT,N,M)
      IMPLICIT NONE 
      INTEGER I,J,N,M,MAT(N,M)
      
      DO 50 I=1,N
         WRITE (*,*) (MAT(I,J), J=1,M)
  50  CONTINUE
	
      RETURN
      END
