#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>

#define MAX 100

typedef double matrix[MAX][MAX];
typedef double vector[MAX];

void print_matrix(matrix A, int w, int k)
{
   printf("macierz %dx%x\n", w, k);

   for(int i=0; i< w;i++)
   {
      for(int j=0; j< k; j++)
         printf(" %5.3f", A[i][j]);
      printf("\n");
   }
}

void print_vector(vector a, int n)
{
   printf("wektor n=%d\n", n);

   for(int i=0; i< n; i++)
   {
      printf(" %5.3f ", a[i]);
   }
   printf("\n");
}


double dist(vector a, vector b, int n)
{
   double d = 0.0;
   int i;

   for (i = 0; i < n; i++)
   {
      d += (a[i] - b[i]) * (a[i] - b[i]);
   }
   return sqrt(d);
}

int main()
{
   int i, j, k;
   matrix A = { {7, 1, 2}, 
                {1, 8, 3}, 
                {2, 3, 9}};
   vector b = {10, 8, 6};
   vector x;
   vector x_prev;

   int max_iter = 100;
   int eps = 0.000001;
   int n=3;

   printf("A: ");
   print_matrix(A, n, n);

   printf("\nb: ");
   print_vector(b, n);

   srand(time(0));

   // losowa inicjalizacja
   for (i = 0; i < n; i++) x[i] = ((float)rand())/RAND_MAX;

   printf("\nx(0): ");
   print_vector(x, n);

   k = 0;
   do
   {
      for (i = 0; i < n; i++) x_prev[i] = x[i];
   
      for (i = 0; i < n; i++)
      {
         x[i] = b[i];
         for (j = 0; j < n; j++)
         {
            if (i!=j) x[i] -= x_prev[j] * A[i][j];
         }
         x[i] /= A[i][i];
      }
      k = k + 1;
   }while(dist(x, x_prev, n) > eps && k < max_iter);

   printf("\nRozwiazanie x: ");
   print_vector(x, n);
   printf("\nIlosc iteracji %d\n", k);
   if (k == max_iter) printf("Brak zbieznosci\n");
}