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

/* Funkcja tworzy macierz o podanej liczbie wierszy 'w' i kolumn 'k'.
 * Wartoscia zwracana jest adres (wskaznik) do tablicy o dlugosci 'w' zawierajacej adresy do tablic o dlugosci 'k' zawierajacych liczby rzeczywiste. */
float **utworz_macierz(int w, int k)
{
	float **m;
	int i=0;
	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)
	  	{
			zwolnij_macierz(m,i);
			return NULL;
		}
	}
	return m;
}

/* Funkcja wyswietla elementy macierzy 'm' posiadajacej 'w' wierszy i 'k' kolumn.  */
void wyswietl_macierz(float **m, int w, int k)
{
	int i,j;
	printf("\nMacierz %dx%d\n",w,k);
	for(i=0;i<w;i++)
 	{
  		for(j=0;j<k;j++)	printf("%6.2f ",*(*(m+i)+j));
 		printf("\n");
	}
}

/* Funkcja zwalnia pamiec zajeta przez macierz 'm' posiadajacej 'w' wierszy. */
void zwolnij_macierz(float **m, int w)
{
	while(w-- > 0) free(*(m+w));
	free(m);
}

/* Funkcja wczytuje wartosci macierzy z ekranu. Macierz 'm' musi byc utworzona dynamicznie za pomoca funkcji 'utworz_macierz' i musi posiadac 'w' wierszy i 'k' kolumn.
   Wartoscia zwracana jest adres macierzy **m
   */
float **wczytaj_macierz(float **m, int w, int k)
{
	int i,j;
 	printf("Podaj elementy macierzy %dx%d\n",w,k);
 	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 zapisuje macierz do pliku tekstowego o podanej nazwie. 
 * Argumentami jest łańcuch znakowy zawieraj±ay nazwe pliku, wskaznik do macierzy m oraz ilosc wierszy w i ilosc kolumn k.
 * Macierz zapisywana jest w pojedynczej linii - pirwsze dwie liczby calkowite umieszczone w pliku to ilosc wierszy i kolumn. 
 * Nastepnie w pliku znajdyja sie wszystkie elementy macierzy z dokladnoscia do 1 miejsca po przecinku.
 */
void zapisz_do_pliku(char *nazwa,float **m,int w, int k)
{
	int i,j;
   FILE *p;

   p=fopen(nazwa,"w");
   if(!p) 
   {
      printf("Blad odczytu pliku %s\n",nazwa);
      return;
   }
	
   fprintf(p,"%d %d",w,k);

 	for(i=0;i<w;i++)
		for(j=0;j<k;j++)
   		fprintf(p," %.1f",*(*(m+i)+j));
	fprintf(p,"\n");
   fclose(p);
}


/* Funkcja odczytuje macierz z pliku. 
 * Pierwszymi liczbami w pliku tekstowym musza byc wymiary macierzy (liczba wierszy i liczba kolumn). Nastepnie, oddzielone spacjami, sa zapisane wszystkie elementy macierzy.
 * Argumentami funkcji sa: nazwa pliku, wskazniki *w i *k dzieki ktorym zwrocona z funkcji zostanie informacja o rozmiarach macierzy.
 * Wartoscia zwracana jest wskaznik float** do macierzy odczytanej z pliku. 
   */
float **wczytaj_z_pliku(char *nazwa,int *w, int *k)
{
	float **m;	
	int i,j;
   FILE *p;

   p=fopen(nazwa,"r");
   if(!p) 
   {
      /* printf("Blad odczytu pliku %s\n",nazwa); */
      return NULL;
   }
	if(fscanf(p,"%d %d",w,k)<2) return NULL;

	m=utworz_macierz(*w,*k);
 	for(i=0;i<*w;i++)
  		for(j=0;j<*k;j++)
   		fscanf(p,"%f",*(m+i)+j);
	
   fclose(p);
   return m;
}
