/***** Programa  que faz uso de funcao *****/
/*** Veja como o programa principal fica bem limpo ***/
/*** Compare com a solucao da aula anterior ***/


/*
 * arquivo: mat_x_vetor.c
 * ---------------------
 * Este programa determina o produto de uma matriz M(mxn)
 * por um vetor x(n).
 */
#include <stdio.h>
#define MMAX 100
#define NMAX 100

/****** Prototipos das funcoes *******************************/

void leia_vetor(double v[], int n);

/*
 * Recebe um vetor de double v[] e um inteiro n.
 * Le n reais e os coloca em em v[], isto 'e, em
 * v[0],...,v[n-1].
 */


void imprima_vetor(double v[], int n);
/*
 * Recebe um vetor de n doubles v[] e o inteiro n
 * e imprime v[], isto 'e, imprime v[0],...,v[n-1].
 */

void leia_matriz(double a[][NMAX], int m, int n);
/*
 * Recebe uma matriz de doubles a[][NMAX] e inteiros m e n.
 * Le m x n reais e os coloca em em a.
 */

void multiplique(double a[][NMAX], double v[], double w[], int m, int n);
/*
 * Recebe uma matriz real m x n em a[][NMAX] um vetor v[] com n reais,
 * e inteiros m e n.  Devolve no vetor w o produto de a por v.
 *
 */

/**********************************************************************/

int main()
{
  int m, n;
  double M[MMAX][NMAX], x[NMAX], y[MMAX];

  printf("Forneca o valor de m e n: ");
  scanf("%d %d", &m, &n);

  leia_matriz(M, m, n);
  leia_vetor(x, n);

  multiplique(M, x, y, m, n);

  printf("O produto 'e o vetor coluna com entradas\n");
  imprima_vetor(y, m);

  return 0;
}

/**********************************************************************/

void leia_vetor(double v[], int n)
{
  int i;

  printf("Forneca o vetor (%d doubles): ", n);

  for (i = 0; i < n ; i++) 
    scanf("%lf", &v[i]);
} 

void imprima_vetor(double v[], int n)
{
  int i;  

  for (i = 0; i < n; i++)   
    printf("%g ", v[i]);
  printf("\n"); 
}   

void leia_matriz(double a[][NMAX], int m, int n) 
{
  int i, j; 

  printf("Forneca as entradas da matriz %d x %d:\n", m, n);
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      scanf("%lf", &a[i][j]);
}

void multiplique(double a[][NMAX], double v[], double w[], int m, int n)
{
  int i, j;
  double s;

  for (i = 0; i < m; i++) {
    s = 0;
    for (j = 0; j < n; j++)
      s = s + a[i][j]*v[j];
    w[i]=s;
  }
}