Hyluss icon

CRS COO macierz rzadka

Hyluss | PRO | 06/07/16 10:51:14 PM UTC | 0 ⭐ | 535 👁️ | Never ⏰ | []
C |

6.09 KB

|

None

|

0 👍

/

0 👎

// 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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎