#include <stdlib.h>
#include <stdio.h>
 
#define FOR(i, end) for ((i) = 0; (i) < (end); ++(i)) 
 
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)
      {
         /*  sprzatanie juz przydzielonej pamieci */
         zwolnij_macierz(m,i);
         return NULL;
      }
   }
   return m;
}
 
void wyswietl_macierz(float **m,int w,int k)
{
   int i,j;
   for(i=0 ; i<w ; i++)
   {
      for(j=0 ; j<k ; j++)
         printf(" %6.1f", *(*(m+i)+j) );
      printf("\n");
   }
}
 
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;
}
 
void zwolnij_macierz(float **m, int w)
{
    while(--w > 0) free(*(m+w));
   free(m);
}

void LiczSrednia( float **m,int w, int k, float srednia, int suma)
{
    int i, j;
    suma=0;
    FOR(i, w)
        FOR(j, k)
            suma = suma + m[i][j];
    srednia = (float ) suma/(w*k);
    printf("Suma elementow: %d\n",suma);
    printf("Srednia arytmetyczna: %f\n\n",srednia);
}
 
int main(int argc, char** argv)
{
   float **m, srednia;
   int w, k, suma;
   printf("Podaj wymiary macierzy:");
   scanf("%d %d",&w,&k);
   m = utworz_macierz(w,k);
   wyswietl_macierz(wczytaj_macierz(m,w,k),w,k);
   LiczSrednia(m, w, k, srednia, suma);
   zwolnij_macierz(m,w);
}
