아까질문한건 알아서 자체 해결하고 조금더 심화과정으로 들어가서 서브루틴+파일에서 읽어 오기를 추가했는데
교수님이 주신 프린터+인터넷 검색을 해봐도 물음표가 가시질 않네요.
물론 에러 메시지도요....ㅜ
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값이 기록되어 있을 파일이며 파일내 저장형태는 다음과 같습니다.
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
...여기까지 제가 아는데까진 다 쓴거 같아요.
솔직히 교수님이 뭐 가르쳐 주신것도 없고 서브루틴으로 해봐라고 해서 못해가도 상관은 없는데
시간을 투자할 수록 오기가 생겨서요.
꼭 해가고 싶습니다. 도와주세요!!!