viernes, 16 de septiembre de 2011

Simetria, diagonal y transpuesta de una matriz

Comprueba si una matriz es simétrica y además halla las diagonales y la transpuesta


#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;

int ** crearMatriz(int fil, int col)
{
    int **M=NULL;
    int i, j;
    int mem=1;        /* flag para indicar que hay memoria para todas las filas */

M=(int **)calloc(fil, sizeof(int *));


    /* se reserva memoria para la tabla de punteros intermedia */
    if (M!=NULL)
{
        for (i=0; i<fil && mem; i++)
{
            if ((M[i]=(int *) calloc(col, sizeof(int)))==NULL)
{
                mem=0;
            }
        }

        if (!mem) {
            for(j=0; j<i-1; j++){
                free (M[j]);
            }

            free (M);
            M=NULL;     /* si no hay memoria se devuelve NULL */
        }
    }
    return M;
}

bool esSimetrica(int **M,int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(M[i][j]!=M[j][i])
return false;
return true;
}

int **transpuesta(int **M,int fil, int col)
{
int **N = crearMatriz(col,fil);

for (int i=0;i<fil;i++)
{
for(int j=0;j<col;j++)
{
N[j][i]=M[i][j];
}
}

return N;
}

void diagonales(int **M,int n)
{
cout<<endl<<endl<<"Diagonal principal:";

for (int i=0;i<n;i++)
{
cout<<endl;

for(int j=0;j<n;j++)
{
if(i==j)
cout<<M[i][j]<<"\t";
else
cout<<"\t";
}
}

cout<<endl<<endl<<"Diagonal sedundaria:";

for (int i=0;i<n;i++)
{
cout<<endl;

for(int j=0;j<n;j++)
{
if(i+j==n-1)
cout<<M[i][j]<<"\t";
else
cout<<"\t";
}
}
}

int **cambiarParesImpares(int **M,int fil,int col)
{
int **N = crearMatriz(fil,col);

for (int i=0;i<fil;i=i+2)
{
for(int j=0;j<col;j++)
{
N[i+1][j]=M[i][j];
N[i][j]=M[i+1][j];
}
}

return N;
}

void mostrarMatriz(int **M,int fil, int col)
{
for(int i=0;i<fil;i++)
{
cout<<endl;

for(int j=0;j<col;j++)
cout<<M[i][j]<<"\t";
}
}

void main()
{
int n;

cout<<"Ingrese orden de matriz (nxn): ";cin>>n;

int **M=crearMatriz(n,n);

for(int i=0;i<n;i++)
{
cout<<endl;

for(int j=0;j<n;j++)
{
cout<<"M["<<i+1<<"]["<<j+1<<"] = ";
cin>>M[i][j];
}
}

mostrarMatriz(M,n,n);

cout<<endl<<endl;

if(esSimetrica(M,n))
cout<<"Matriz SI es simetrica";
else
cout<<"Matriz NO es simetrica";

diagonales(M,n);

cout<<endl<<endl<<"Transpuesta: "<<endl;
mostrarMatriz(transpuesta(M,n,n),n,n);



cout<<endl<<endl<<"Matriz con filas pares e impares cambiadas: "<<endl;
if(n%2==0)
mostrarMatriz(cambiarParesImpares(M,n,n),n,n);
else
cout<<"No hay igual numero de filas pares e impares";

_getch();
}

No hay comentarios:

Publicar un comentario