게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
저 다시 포트란 하나 여쭤봐도 될까요?
게시물ID : programmer_8946짧은주소 복사하기
작성자 : 밝은달사랑
추천 : 0
조회수 : 986회
댓글수 : 2개
등록시간 : 2015/03/27 22:53:24
옵션
  • 본인삭제금지
아까질문한건 알아서 자체 해결하고 조금더 심화과정으로 들어가서 서브루틴+파일에서 읽어 오기를 추가했는데
교수님이 주신 프린터+인터넷 검색을 해봐도 물음표가 가시질 않네요.
물론 에러 메시지도요....ㅜ


      program arrmtp
c 행렬 A와 B를 곱한 결과물을 도출하기 위한 식입니다.
     
      integer ia, ja, ib, jb, n, m, multi, q1
c i와 j는 A,B행렬의 열과 행의 크기를 위한 변수입니다.
c n,m은 A,B에 직접 행렬값을 입력시 루프문을 위한 변수이자 multi와 함께 곱셈계산에 사용됩니다.
c q1은 키보드 입력값과 비교를 통해 1이면 행렬값 직접입력, 미입력시 행렬값을 파일에서 읽어옵니다.
      real a(10,10), b(10,10), C(10,10) ,adat, bdat
c 행렬 A, B, C는 실수값으로 최대10X10의 크기를 갖도록 지정했습니다.
      n=0
      m=0
     
      open(100,file='output.dat')
      open(200,file='input.dat')
      open(300,file='input2.dat')
c 아웃풋은 최종적인 결과물이 저장되 파일로 오픈합니다.
c 인풋은 행렬A값이 기록되어 있을 파일이며 파일내 저장형태는 다음과 같습니다.
인풋.PNG
c 인풋2는  행렬B값이 기록되어 있을 파일이며 파일내 저장형태는 인풋과 동일합니다.
     
      write(*,*) 'Array i and j maximum is 10'

      write(*,*) 'Array A is i size, ia ='
      read (*,*) ja
      write(*,*) 'Array A is j size, ja ='
      read (*,*) ia
c 행렬A의 행과 열의 크기를 입력받는 란입니다.
c 출력과 입력 변수가 일치하지 않는 것은 추후 출력 형태를 1행을 먼저 출력하고 다음열로 넘어가게 하기 위해서 입니다.

      write(*,*) 'Array B is i size, ib ='
      read (*,*) jb
      write(*,*) 'Array B is j size, jb ='
      read (*,*) ib
     
      if(ia .NE. jb) then
c 행렬의 곱셈을 위해 필요한 기본 조건을 만족하지 않는 경우 계산 불가능을 출력하도록 했습니다.
          write(*,*) 'Array A and B is not multiply'

      else
          write(*,*) 'input : data typing=1, file load=x'
          read(*,*) q1
c 계산이 가능한 경우 변수 q1을 입력받아 행렬값을 타이핑, 또는 파일에서 읽어오는 조건을 지정했습니다.
         
          if(q1 .Eq. 1) then
c 단순하게 q1이 1이면 타이핑, 그외는 몽땅 파일로드로 하기 위한 조건문입니다.
          do 10 n = 1,ia,1
             m=0
             do 20 m = 1,ja,1
                write(*,400) 'Array A(i,j) adat', m, n
  400           format (A,I2,I2)
                read(*,*) adat
                a(n,m) = adat
   20        continue
   10      continue
c 타이핑을 선택한 경우 A행렬의 값을 앞에서 입력한 행렬의 크기에 따라 입력하는 루프문입니다.
 
           n=0
           m=0

           do 30 n = 1,ib,1
              m=0
              do 40 m = 1,jb,1
                 write(*,500) 'Array B(i,j) bdat', m, n
  500            format (A,I2,I2)
                 read(*,*) bdat
                 b(n,m) = bdat
  40          continue
  30       continue  
c 타이핑을 선택한 경우 B행렬의 값을 앞에서 입력한 행렬의 크기에 따라 입력하는 루프문입니다.   
         
      call amtlb
c 행렬의 곱셈을 서브루틴으로 계산하고 불러올때 쓴다는데 모르겠습니다.(도와주세요ㅜㅜ)

      write(100,600) 'Array C is =', c
      write(200,600) 'Array A is =', a
      write(300,600) 'Array B is =', b
  600 format (A,/,10(F4.1,X,X))
c 최종적으로 3행렬을 오픈되어있는 파일에 기록하기 위한 출력문입니다.
c 원래는 goto문으로 보내려 했는데 안 되서 필요한 곳마다 붙여 넣었습니다.       
         
          else
         
            write(*,*) 'input.dat=a, input2.dat=b'
            read(200,*) ((a(i, j), j=1,10), i=1,10)
            read(300,*) ((b(i, j), j=1,10), i=1,10)
c 파일에서 불러 올때라고 찾아서 보는데 이게 맞는 걸까요???

      call amtlb
c 타이핑때와 마찬가지로 서브루틴으로부터 행렬곱을 받아오기 위함입니다.

      write(100,600) 'Array C is =', c
      write(200,600) 'Array A is =', a
      write(300,600) 'Array B is =', b
  600 format (A,/,10(F4.1,X,X))
           
          endif      

      endif 

      stop
      end
     
     
      subroutine amtpb
c 행렬 A와 B의 곱셈을 서브루틴으로 따로 빼낸 부분입니다.
     
      integer ib, ja, m, n, multi
      real c(10,10)
      m=0
      n=0
      mult=0
c 서부루틴의 변수는 가변수 어쩌고가 있는데 그걸 어떻게 사용하는지를 모르는 관계로
c 기존과 동일한 변수를 사용하였습니다.

      do 50 m = 1,ib,1
        n=0
        do 60 n = 1,ja,1
            multi=0
            do 70 multi = 1,ia,1
                   c(m,n)=c(m,n)+b(m,multi)*a(multi,n)
 70         continue
 60     continue
 50   continue
 
       return
       end

...여기까지 제가 아는데까진 다 쓴거 같아요.
솔직히 교수님이 뭐 가르쳐 주신것도 없고 서브루틴으로 해봐라고 해서 못해가도 상관은 없는데
시간을 투자할 수록 오기가 생겨서요.
꼭 해가고 싶습니다. 도와주세요!!!
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호