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

void leggiMatrice(float mat[MAX][MAX]);
float mediaRiga(float vet[MAX]);
void ordinaRighe(float mat[MAX][MAX]);
void stampaMatrice(float mat[MAX][MAX]);
void scambiarighe(float mat[MAX][MAX]);



int r = 0;
int c = 0;
int main()
{
    float mat[MAX][MAX];
    float vetRiga[MAX];
    float vetMedia[MAX];
    float vetMin[MAX];
    int primaColonna[MAX];


    leggiMatrice(mat);
    printf("Matrice inserita:\n");
    stampaMatrice(mat);

     for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            vetRiga[j] = mat[i][j];

        }
       vetMedia[i] = mediaRiga(vetRiga);
    }
    for(int i=0; i<r; i++)
    {
        mat[i][c] = vetMedia[i];
    }
    c++;

    stampaMatrice(mat);

    ordinaRighe(mat);
    stampaMatrice(mat);


    scambiarighe(mat);

    printf("Matrice ordinata:\n");


    stampaMatrice(mat);







}


void leggiMatrice(float mat[MAX][MAX])
{

    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",&mat[i][j]);
        }
    }

}


float mediaRiga(float vet[MAX])
{
    float temp =0;
       for(int i=0; i<c; i++)
    {
        temp = temp + vet[i];
    }
    temp = temp/c;
    return temp;
}



void stampaMatrice(float mat[MAX][MAX])
{

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



void ordinaRighe( float mat[MAX][MAX]){
    int min=0;
    float temp =0;


   for(int k=0; k<r; k++)
   {
       min =0;
       temp=0;
        for(int i=0; i<c; i++)
        {
            min = i;
            for(int j=i+1; j<c; j++)
            {
                if(mat[k][min]>mat[k][j])
                {
                    min = j;
                }

            }

            temp=mat[k][min];
            mat[k][min] = mat[k][i];
            mat[k][i] = temp;
        }
   }

}


void scambiarighe(float mat[MAX][MAX]){
    float temp = 0;
    float ultimaCol[MAX];
    int vetMin[MAX];
    int min=0;
    for(int j=0; j<r; j++)
        {
           ultimaCol[j] = mat[j][c-1];
        }

    for(int i=0; i<r; i++)
    {
        min = i;
        for(int j=i+1; j<r; j++)
        {
            if(ultimaCol[min]>ultimaCol[j])
            {
                min = j;
            }

        }
        vetMin[i]=min;
        temp=ultimaCol[min];
        ultimaCol[min] = ultimaCol[i];
        ultimaCol[i] = temp;

    }



        temp = 0;
       for(int k=0; k<r; k++)
            {
                for(int i =0; i< c; i++)
                {
                    temp = mat[vetMin[k]][i];
                    mat[vetMin[k]][i] = mat[k][i];
                    mat[k][i] = temp;

                }
            }
}