C     Para compilar este programa, usando gfortran (linux), basta digitar:
C     gfortran -c exemplo.f
C     gfortran exemplo.o -o exemplo

      program exemplo

C     Isto eh um comentario. Pode usar o c ou o C na primeira coluna e, para os comentarios, nao existe limite de onde a linha acaba.
  
C     Definicao de uma constante.

      integer     nmax
      parameter ( nmax = 100 )

C     Declaracao das variaveis.

      integer i,j,n
      double precision A(nmax,nmax),b(nmax),Ab(nmax)

C     Aqui sao declaradas varias variaveis que nao vao ser usadas, soh para
C     mostrar o que fazer quando a linha fica muito grande.
C     Soh permitido escrever ate a segunda letra a da variavel5. Por isso,
C     deixamos o que passa desta coluna na linha de baixo, mas sem cortar
C     o nome de nenhuma variavel.
C     O sinal de + diz que a linha de baixo eh uma continuacao da linha de 
C     cima. Este sinal tem de ficar nesta coluna em que esta e pode ser
C     trocado por um *.

      double precision variavel1, variavel2, variavel3, variavel4, 
     +     variavel5, variavel6

C     Leitura de n.

      write(*,*) 'Digite o numero de elementos da matriz (maximo 100): '
      read(*,*) n

C     Validacao do n digitado.

      if ( n .gt. 100 .or. n .le. 0 ) then
         write(*,*) 'Numero de elementos incorreto!'
         go to 100
      end if

C     Leitura da matriz A. 
C     Quando temos "do i = a,b" significa que temos um laco em 
C     que i comeca valendo a e varia de 1 em 1 ate atingir o valor 
C     b (inclusive).
C     No fortran, ao contrario do C, as matrizes sao armazenadas 
C     por colunas. Por isso, percorra-las por colunas eh mais eficiente.

      write(*,*) 'Digite os elementos da matriz A, coluna por coluna:'
      do j = 1,n
         do i = 1,n
            read(*,*) A(i,j)
         end do
      end do

C     Leitura do vetor b.

      write(*,*) 'Digite os elementos do vetor b: '
      do i = 1,n
         read(*,*) b(i)
      end do
      
C     Chama uma rotina para calcular o produto de A e b.

      call prod(n,nmax,A,b,Ab)

C     Imprime os elementos de Ab.

      write(*,*) 'Elementos do vetor Ab: '
      do i = 1,n
         write(*,*) Ab(i)
      end do

C     Este continue significa que quem foi direcionado para 100
C     usando o go to, soh precisa passar para a proxima linha
C     e continuar o processamento normalmente.
C     Outra possibilidade seria nao ter esse continue e ter
C     um 100 na frente do end.

 100  continue

      end

C     ------------------------------------------------------------------
C     Esta rotina vai calcular o produto de uma matriz e um vetor.
C     Note que ela nao precisa ser definida antes de ser usada.
C     ------------------------------------------------------------------

      subroutine prod(n,ldm,M,v,w)
     
C     Declaracao dos tipos dos parametros.
C     Como soh preciso olhar para as n primeiras posicoes dos vetores,
C     declaro todos com dimensao n (se n for menor que 100, o resto
C     do vetor eh ignorado pela rotina).
C     No caso da matriz, nao posso dizer que ela eh n x n. Como ela
C     eh armazenada por colunas, digo para ver as primeiras n colunas,
C     mas o numero de linhas declarado aqui tem de ser o numero de 
C     linhas original.

      integer n,ldm
      double precision M(ldm,n),v(n),w(n)

C     Declaracao das variaveis locais da rotina.
      integer i,j

      do i = 1,n
         w(i) = 0.0d0
      end do

      do j = 1,n
         do i = 1,n
            w(i) = w(i) + M(i,j) * v(j)
         end do
      end do

      end
