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


void leggiMatrice(float mat[MAX][MAX],  int *d);
void stampaMatrice(float mat[MAX][MAX], int d);
float calcoloMedia(float mat[MAX][MAX], int d);
float minimoDiag(float mat[MAX][MAX], int d);
void sottraiMedia(float mat[MAX][MAX],float media, int d);
void aggiungiMinimo(float mat[MAX][MAX],float minimo, int d);
void ordinaRighe(float mat[MAX][MAX], int d);


int main()
{
    int d = 0;
    float media = 0;
    float minimo = 0;
    float mat[MAX][MAX];
    leggiMatrice(mat, &d);
    stampaMatrice(mat,d);
    media = calcoloMedia(mat,d);
    printf("%2.f",media,d);
    minimo = minimoDiag(mat,d);
    sottraiMedia(mat, media,d);
    aggiungiMinimo(mat, minimo,d);
    stampaMatrice(mat,d);
    ordinaRighe(mat,d);
    stampaMatrice(mat,d);

    return 0;
}

void leggiMatrice(float mat[MAX][MAX], int *d){

    printf("Per piacere, inserisci la dimensione della matrice? \n\n");
    scanf("%d", d);

    printf("Inserisci la matrice.\n");

    for(int i = 0; i<*d; i++)
    {
        for(int j=0; j<*d; j++)
        {
            printf("Inserisci il valore al posto [%d][%d]", i+1,j+1);
            scanf("%f",&mat[i][j]);
        }

    }
}

void stampaMatrice(float mat[MAX][MAX], int d){

    printf("\n");
    for(int i = 0; i<d; i++)
    {

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

float calcoloMedia(float mat[MAX][MAX], int d){
    float media = 0;

    for(int i=0; i<d; i++)
    {
        media += mat[i][i];
    }
    media = media/d;
    return media;
}


float minimoDiag(float mat[MAX][MAX], int d){
    float minimo = 0;
    minimo = mat[0][0];
    for(int i=1; i<d; i++)
    {
        if(minimo>mat[i][i])
        {
            minimo = mat[i][i];
        }
    }

    return minimo;
}

void sottraiMedia(float mat[MAX][MAX], float media, int d){

    for(int i = 0; i<d-1; i++)
    {

        for(int j=i+1; j<d; j++)
        {
            mat[i][j] -= media;
        }
    }

}

void aggiungiMinimo(float mat[MAX][MAX], float minimo, int d){

    for(int i=1; i<d; i++){
        for(int j=0; j<i; j++){
            mat[i][j] += minimo;
        }
    }

}


void ordinaRighe(float mat[MAX][MAX], int d){

    int max2 = 0;
    int temp = 0;

    for(int i=0; i<d; i++)
    {
        max2 = i;
        for(int j = i+1; j<d ; j++){
            if(mat[max2][0]<mat[j][0])
            {

                max2 = j;
            }

        }
        if(max2 != i)
        {
             for(int k=0; k<d; k++)
            {
                temp = mat[max2][k];
                mat[max2][k] = mat[i][k];
                mat[i][k]= temp;
            }

        }


    }

}