// MojeMACIERZ.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
#include <malloc.h>
struct MacierzCOO
{
int Wiersz;
int Kolumna;
float Wartosc;
};
struct MacierzRzadka
{
int licznik;
struct MacierzCOO *MC;
};
struct MacierzNormalna
{
float **tab;
int Wiersze;
int Kolumny;
};
void Sumuj (MacierzRzadka *MacierzPrzekazana, int w)
{
float suma=0;
for (int i=0;i<MacierzPrzekazana->licznik; i++)
{
if (MacierzPrzekazana->MC[i].Wiersz == w)
{
suma = MacierzPrzekazana->MC[i].Wartosc + suma;
}
}
printf ("Wyswietl sume w %d wierszu - %f\n",w,suma);
}
void WyswietlMacierzCOO(MacierzRzadka *MacierzPrzekazana)
{
printf ("[Wartosc] Wiersze Kolumny\n");
for (int i=0; i<MacierzPrzekazana->licznik;i++)
{
printf ("%d - %.3f %d %d\n",i+1,MacierzPrzekazana->MC[i].Wartosc,MacierzPrzekazana->MC[i].Wiersz,MacierzPrzekazana->MC[i].Kolumna);
}
}
void StworzCOO (MacierzNormalna *MacierzPrzekazana, MacierzRzadka *MacierzR)
{
int licznik=0;
for (int w=0; w < MacierzPrzekazana->Wiersze ; w++)
{
for (int k=0; k < MacierzPrzekazana->Kolumny ; k++)
{
if (MacierzPrzekazana->tab[w][k])
{
licznik++;
if (licznik==1)
{
MacierzR->MC = (MacierzCOO*) malloc(sizeof(MacierzCOO));
}
else
{
MacierzR->MC = (MacierzCOO*) realloc(MacierzR->MC,sizeof (MacierzCOO)*licznik);
}
MacierzR->MC[licznik-1].Wiersz = w;
MacierzR->MC[licznik-1].Kolumna = k;
MacierzR->MC[licznik-1].Wartosc = MacierzPrzekazana->tab[w][k];
printf ("%f \n",MacierzR->MC[licznik-1].Wartosc); //
}
}
}
MacierzR->licznik = licznik;
}
bool WczytajMacierz (MacierzNormalna *MacierzPrzekazana)
{
int licznik=0;
FILE *plik = fopen ("Macierz.txt","r");
if (plik !=NULL)
{
fscanf (plik,"%d %d", &MacierzPrzekazana->Wiersze, &MacierzPrzekazana->Kolumny);
//tab dyn
MacierzPrzekazana->tab = (float**) malloc (sizeof (float)*(MacierzPrzekazana->Wiersze));
for (int w=0; w < MacierzPrzekazana->Wiersze ;w++)
{
MacierzPrzekazana->tab[w]=(float*) malloc (sizeof (float)*MacierzPrzekazana->Kolumny);
}
//wypelnienie
for (int w=0; w < MacierzPrzekazana->Wiersze ; w++)
{
for (int k=0; k < MacierzPrzekazana->Kolumny ; k++)
{
fscanf (plik,"%f",&MacierzPrzekazana->tab[w][k]);
}
}
fclose(plik); return true;
}else fclose(plik); return false;
}
struct MacierzKolumn
{
float wartosc;
int nrkolumny;
};
struct MacierzWiersz
{
int nrwiersza, polozenie;
};
struct MacierzCRS
{
struct MacierzKolumn *MK;
struct MacierzWiersz *MW;
int iloswiersz;
int ilosckolumna;
};
void StworzC (MacierzNormalna *MacierzPrzekazana, MacierzCRS *MacierzC)
{
int licznik=0, element=0,licznik2=0;
for (int w=0; w < MacierzPrzekazana->Wiersze ; w++)
{
element=0;
for (int k=0; k < MacierzPrzekazana->Kolumny ; k++)
{
if (MacierzPrzekazana->tab[w][k])
{
licznik++;
if (licznik==1)
{
// MacierzPrzekazana->Elementy_struktura->eletab = (float*) malloc ((licznik)*sizeof (float)); //tworzenie drugiej MACIERZY
MacierzC->MK = (MacierzKolumn*) malloc(sizeof(MacierzKolumn));
}
else
{
MacierzC->MK = (MacierzKolumn*) realloc(MacierzC->MK,sizeof (MacierzKolumn)*licznik);
}
MacierzC->MK[licznik-1].nrkolumny = k;
MacierzC->MK[licznik-1].wartosc = MacierzPrzekazana->tab[w][k];
if (!element)
{
licznik2++;
if (licznik2==1)
{
MacierzC->MW = (MacierzWiersz*) malloc(sizeof(MacierzWiersz));
}
else
{
MacierzC->MW = (MacierzWiersz*) realloc(MacierzC->MW,sizeof (MacierzWiersz)*licznik);
}
MacierzC->MW[licznik2-1].nrwiersza = w;
MacierzC->MW[licznik2-1].polozenie = licznik;
element++;
}
}
}
}
MacierzC->ilosckolumna = licznik;
MacierzC->iloswiersz = licznik2;
}
void WyswietlMacierzCRS (MacierzCRS *MacierzPrzekazana)
{
// for (int w=0; w < MacierzPrzekazana->Wiersze ; w++)
for (int k=0; k < MacierzPrzekazana->ilosckolumna ; k++)
{
// MacierzPrzekazana->MK[k].
for (int w=MacierzPrzekazana->iloswiersz-1 ; w>=0 ; w--)
{
if (MacierzPrzekazana->MW[w].polozenie <= k+1)
{
printf ("%d %d %f\n",MacierzPrzekazana->MW[w].nrwiersza, MacierzPrzekazana->MK[k].nrkolumny, MacierzPrzekazana->MK[k].wartosc);
break;
}
}
}
}
float SumaMacierzCRS (MacierzCRS *MacierzPrzekazana, int nrw)
{
float suma=0;
for (int k=0; k < MacierzPrzekazana->ilosckolumna ; k++)
{
for (int w=MacierzPrzekazana->iloswiersz-1 ; w>=0 ; w--)
{
if (MacierzPrzekazana->MW[w].polozenie <= k+1)
{
if (MacierzPrzekazana->MW[w].nrwiersza == nrw)
{
suma = MacierzPrzekazana->MK[k].wartosc +suma;
}
break;
}
}
}
return suma;
}
int _tmain(int argc, _TCHAR* argv[])
{
//MacierzCOO * MCOO;
MacierzRzadka MacierzR;
MacierzNormalna MacierzN;
if(WczytajMacierz((MacierzNormalna*)&MacierzN)) //Udalo sie wczytac macierz wiec dzialamy
{
StworzCOO ((MacierzNormalna*)&MacierzN, (MacierzRzadka*)&MacierzR);
WyswietlMacierzCOO((MacierzRzadka*)&MacierzR);
Sumuj ((MacierzRzadka*)&MacierzR, 2);
Sumuj ((MacierzRzadka*)&MacierzR, 3);
Sumuj ((MacierzRzadka*)&MacierzR, 4);
// ZwolnijMacierzCOO(MacierzCOO);
}
else
{
free((MacierzNormalna*)&MacierzN); //Pamietac o zwolnieniu pamieci
}
MacierzCRS MacierzC;
StworzC ((MacierzNormalna*)&MacierzN, (MacierzCRS*)&MacierzC);
WyswietlMacierzCRS ((MacierzCRS*)&MacierzC);
for (int i=0; i<10;i++)
{
printf ("%.3f\n",SumaMacierzCRS ((MacierzCRS*)&MacierzC,i));
}
_getch();
return 0;
}
/* Macierz.txt
10 3
0.75 0.00 0.00
0.25 0.00 0.00
0.00 0.00 0.00
0.00 0.00 0.00
0.00 1.50 0.25
0.50 0.00 0.00
0.00 0.00 0.00
1.75 0.00 0.00
0.05 0.50 0.00
55.00 0.00 1.25
*/
Comments
0 B
|👍
/👎