      PROGRAM GAUSSB
c     ROZWIAZUJE UKLAD ax=f
c     WYNIK W PLIKU X LUB NA EKRANIE'
      implicit none
      integer N,pyt
      
   10 write(*,*)'PROGRAM GAUSSB'
      write(*,*)'BEZ WYBORU'
      write(*,*)'PODAJ N - WYMIAR MACIERZY'
      read (*,*) N

      call SUBMAIN(N)

      write(*,*)'GOTOWE'
      write(*,*)' 0 - KONIEC'
      write(*,*)' 1 - OD POCZATKU'
      read (*,*) pyt
      if(pyt.eq.0)goto 100
      if(pyt.eq.1)goto 10
  100 stop 100
      end

      subroutine SUBMAIN(N)
      implicit none
      real*8 a,f,x,O,E,AA,FF
      integer N,l,k,pyt
      dimension a(N,N),f(N),x(N),AA(N,N),FF(N)

c     WPROWADZANIE DANYCH
      write(*,*)' 10 - CZYTAJ Z KONSOLI'
      write(*,*)' 11 - CZYTAJ WIERSZAMI Z PLIKOW AA I FF'
      read (*,*) pyt
      if(pyt.eq.10)then
      goto 30
      else

c     CZYTANIE Z PLIKOW
      open(unit=20,file='AA')
      rewind(20)
      do 10,l=1,N,1
      do 11,k=1,N,1
      read (20,*) a(l,k)
   11 continue
   10 continue
      close(20)
      open(unit=21,file='FF')
      rewind(21)
      do 12,l=1,N,1
      read (21,*) f(l)
   12 continue
      close(21)
      goto 31
      endif

c     CZYTANIE Z KONSOLI
   30 write(*,*)'PODAWAJ a(l,k) WIERSZAMI'
      do 1,l=1,N,1
      do 2,k=1,N,1
      read (*,*) a(l,k)
    2 continue
      write(*,*)'W=',l
    1 continue
      write(*,*)'KONIEC'
      write(*,*)'PODAWAJ f(l)'
      do 3,l=1,N,1
      read (*,*) f(l)
    3 continue
   31 call GAUSS(N,a,f,x)

      open(unit=10,file='X')
      rewind(10)
      do 4,l=1,N,1
      write(10,*) x(l)
    4 continue
      close(10)

      write(*,*)' 2 - ZAPISZ WYNIKI W PLIKU X I NA EKRANIE'
      write(*,*)' 3 - NIE WYPISUJ NA EKRANIE'
      write(*,*)'<ENTER>'
      read (*,*) pyt
      if(pyt.eq.2)then
      do 5,l=1,N,1
       if(mod(l,10).eq.0)then
       write(*,*)'l=',l,' x=',x(l)
       write(*,*)'<ENTER>'
       read (*,*)
       else
       write(*,*)'l=',l,' x=',x(l)
       endif
    5 continue
      else
      goto 20
      endif
   20 return
      end




      subroutine GAUSS(N,a,f,x)
c     ELIMINACJA BEZ WYBORU
c     WYMIAR MACIERZY (N+1)x(N+1)
c     l,k=0:N
      implicit none
      
      real*8 a,f,x,z,O,E
      integer p,l,k,N
      dimension a(N,N),f(N),x(N)
      O=real(0)
      E=real(1)

c     ELIMINACJA
      do 1,p=1,N-1,1
      do 2,l=p+1,N,1
      z=a(l,p)
      do 3,k=p,N,1
      a(l,k)=a(l,k)-z*a(p,k)/a(p,p)
    3 continue
      f(l)=f(l)-z*f(p)/a(p,p)
    2 continue
    1 continue


c     UKLAD TROJKATNY
      x(N)=f(N)/a(N,N)
      do 4,l=N-1,1,-1
      x(l)=f(l)
      do 5,k=l+1,N,1
      x(l)=x(l)-a(l,k)*x(k)
    5 continue
      x(l)=x(l)/a(l,l)
    4 continue
      return
      end