// MojeMACIERZ.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include 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;ilicznik; 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; ilicznik;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 */