#include <stdio.h>
#include <stdlib.h>
#define MAX 100


/*ATTENZIONE:
TENETE NOTA NEL SEGUENTE ESERCIZIO CHE LA MATRICE
VIENE SALVATA TUTTA SU INDIRIZZI SUCCESSIVI, LA POSIZIONE [I][J]
NON CORRISPONDE ALL'INDIRIZZO *(MAT + I*C + J). 
PER RISOLVERE IL PROBLEMA USARE LE FUNZIONI DI MALLOC PER 
DEALLOCARE MEMORIA DALLA MATRICE */


void leggiMatrice(float *p);
void stampaMatrice(float *p);
void contaValori(float *p, float *valori);
void stampaVettore(float *p);

struct LaMiaStruct
{
        float val;
        int numOccorrenze;
        int mat[MAX][2];
};





int r = 0;
int c = 0;
int ValoriDiversi =0;

int main()
{

    struct LaMiaStruct VectStruct[MAX];
    float mat[MAX][MAX];
    float *p = mat;
    float valori[MAX];
    leggiMatrice(mat);
    stampaMatrice(mat);
    contaValori(mat,valori);
    stampaMatrice(mat);

    stampaVettore(valori);

    int occorrenza = 0;
    int RigaProv =0;
    int ColonnaProv = 0;

       for(int i=0; i<r; i++)
    {
        printf("\n");
        for(int j=0; j<c; j++)
        {
            printf("%.1f",mat[i][j]);
        }
    }


    printf("%d", ValoriDiversi);
    for(int i=0; i<ValoriDiversi; i++)
    {
        VectStruct[i].val = valori[i];
        occorrenza = 0;
        for(int k=0; k<r; k++)
        {
        for(int j=0; j<c; j++)
            {

                if(*(p +k*c +j) == valori[i])
                {
                   VectStruct[i].mat[occorrenza][0]=k;
                    VectStruct[i].mat[occorrenza][1]=j;
                    occorrenza ++;
                }
            }
        }
        VectStruct[i].numOccorrenze = occorrenza;
    }




    for(int i=0; i<ValoriDiversi; i++)
    {
         printf("\n");
         printf("il valore %.1f esiste %d volte", VectStruct[i].val,VectStruct[i].numOccorrenze );
         for(int j=0; j<VectStruct[i].numOccorrenze; j++)
         {
            printf("[%d][%d] \n",  VectStruct[i].mat[j][0],  VectStruct[i].mat[j][1]);

         }
    }




    return 0;
}


void leggiMatrice(float *p)
{

    printf("Inserisci, per piacere, il numero di righe della matrice?\n");
    scanf("%d",&r);
    printf("Inserisci, per piacere, il numero di colonne della matrice?\n");
    scanf("%d",&c);
    printf("Inserisci, per piacere, la matrice?\n");

    for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            printf("Inserisci l'elemento di posto [%d][%d]:\n",i+1,j+1);
            scanf("%f",(p+i*c+j));
        }
    }

}


void stampaMatrice(float *p)
{

    for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            printf("%.1f ",*(p+i*c+j));
        }
        printf("\n");
    }
}

void stampaVettore(float *p)
{

    for(int i=0; i<ValoriDiversi; i++)
    {

            printf("%.1f ",*(p+i));


    }
}



void contaValori(float *p, float *valori)
{
    ValoriDiversi = 0;
    int trovato = 1;

     for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            trovato = 1;
            for(int k=0; k<ValoriDiversi; k++)
            {
                 if(*(p+i*c+j) == *(valori+k))
                 {
                     trovato = 0;
                 }

            }
            if(trovato==1)
            {
                *(valori+ValoriDiversi) = *(p+i*c+j);
                ValoriDiversi++;
            }

        }

    }


}