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

/* Funkcja tworzy macierz (alokuje pamiec) o podanej liczbie wierszy 'w' i kolumn 'k'. 
 * Argumenty:
 *   'w' - liczba wierszy
 *   'k' - liczba kolumn
 * Wartoscia zwracana jest wskaznik do macierzy (adres poczatku tablicy zawierajacej adresy kolejnych wierszy macierzy).  */
float **utworz_macierz(int w, int k)
{
   float **m;
   int i;
   
   m = (float**)malloc( w * sizeof(float*));
   if ( m == NULL ) return NULL;

   for(i=0; i<w; i++)
   {
      m[i] = (float*)malloc( k * sizeof(float));
      if( m[i] == NULL ) return NULL;
   }

   return m;
}

/*  Funkcja wyswietla macierz 
 *  Argumenty:
 *    'm' - wskaznik do macierzy (adrese poczatku tablicy zawierajacej adresy do kolejnych wierszy macierzy) 
 *    'w' - liczba wierszy macierzy
 *    'k' - liczba kolumn macierzy
 */
void wypisz_macierz(float **m, int w, int k)
{
   int i,j;

   printf("\nMacierz o wymiarach %dx%d\n\n", w, k);
   for(i=0; i<w; i++)
   {
      for(j=0; j<k; j++)
      {
         printf("%5.2f ",  m[i][j]   ) ;
      }
      printf("\n");
   }
   printf("\n");
}

/*  Funkcja wczytuje elementy macierzy
 *  Argementy:
 *     'm' - adres (wskaznik) do macierzy, 
 *     'w' -liczba wierszy, 
 *     'k' - liczba kolumn.  
 * Wartoscia zwracana jest adres do macierzy o zmodyfikowanych wartosciach. */
float** wczytaj_macierz(float **m, int w, int k)
{
   int i,j;
   for(i=0 ; i<w ; i++)
   {
      for(j=0 ; j<k ; j++)
      {
         printf(" [%d,%d] = ", i,j);
         scanf("%f", *(m+i)+j); 
      }
   }
   return m;
}

/* Funkcja zwalnia pamiec zajeta przez macierz 'm'.
 * Argumenty:
 *   'm' - wskaznik do macierzy
 *   'w' - liczba wierszy
 **/
void zwolnij_macierz(float **m, int w)
{
   int i;
   for (i = 0; i < w; ++i) free(m[i]);
   free(m);
}


float **dodaj_macierze(float **m1, int w1, int k1, float **m2, int w2, int k2)
{
   float **m3 = NULL;
   int i, j;

   if ( k1 != k2 || w1 != w2 )
   {
      printf("Niepoprwane wymiary\n");
      return NULL;
   }

   m3 = utworz_macierz(w1, k1);

   for (i=0; i<w1; i++) 
     for (j=0; j<k1; j++) 
        m3[i][j] = m1[i][j] + m2[i][j];

   return m3;
}


int main()
{
   float **m1;
   float **m2;
   float **m3;
   int w1, k1, w2, k2, w3, k3;

   printf("podaj rozmiary pierwszej macierzy w i k: ");
   scanf("%d", &w1);
   scanf("%d", &k1);

   m1 = utworz_macierz(w1, k1);
   if ( m1 == NULL )
   {
       printf("Pokawil sie problem przy alokacji macierzy\n");
       exit(1);
   } 

   wczytaj_macierz(m1, w1, k1);
   wypisz_macierz(m1, w1, k1);

   printf("podaj rozmiary drugiej macierzy w i k: ");
   scanf("%d", &w2);
   scanf("%d", &k2);

   m2 = utworz_macierz(w2, k2);
   if ( m1 == NULL )
   {
       printf("Pokawil sie problem przy alokacji macierzy\n");
       exit(1);
   }
   
   wczytaj_macierz(m2, w2, k2);
   wypisz_macierz(m2, w2, k2);

   m3 = dodaj_macierze(m1, w1, k1, m2, w2, k2);
   if ( m3!= NULL )
   {
      printf("Wynik daodawnia\n");
      wypisz_macierz(m3, w1, k1);
      zwolnij_macierz(m3, w1);
   }

   zwolnij_macierz(m1, w1);
   zwolnij_macierz(m2, w2);

   return 0;
}




