fbpx

Ayuda ejemplo 5. Matrices

  • Carlos Ibarra

    Miembro
    16 diciembre, 2019 en 5:40 pm

    Hola, la comparacion que se hace es asi:

    Primero compara si es el mismo numero de filas y columnas, si son iguales es cuadrada.

    para saber si es simetrica compara lo siguiente.

    [0,1] con [1,0]

    [0,2] con [2,0]

    [1,2] con [2,1]

    los otros no importa seran siempre iguales.

    en otro caso mostrara que no es simetrica.

    Espero esto te ayude a entender un poco.

    Saludos

    • Paola Vega Oviedo

      Miembro
      18 diciembre, 2019 en 2:36 pm

      Me refiero a esto, que siento que aunque entre al if anidado para comparar cada coeficiente todo lo toma como verdadero aunque no sea así entonces aunque sea cuadrada pero no simétrica dice que si es simétrica. 

      Y gracias por la ayuda. 

  • Paola Vega Oviedo

    Miembro
    16 diciembre, 2019 en 11:24 pm

    La cosa es que siento que no hace nada el if anidado, cuando va comparando los datos de la matriz con la transpuesta. 

    • Angel Sánchez

      organizador
      18 diciembre, 2019 en 3:23 pm

      Hola, podrías pasarme tu código para analizarlo, por favor 😀

      • Paola Vega Oviedo

        Miembro
        18 diciembre, 2019 en 3:47 pm

        Claro, seria de gran ayuda. Blush

        /* Matriz simétrica

        Una matriz es simétrica si es cuadrada y si es igual a su transpuesta */

        #include<iostream>

        using namespace std;

        int main(){

        int filas = 0, columnas = 0;

        char condicion = ‘F’;

        cout<<“Ingrese el numero de filas: “;

        cin>>filas;

        cout<<“Ingrese el numero de columnas: “;

        cin>>columnas;

        cout<<endl;

        int matriz[filas][columnas] = {};

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

        for(int j = 0; j < columnas; j++){

        cout<<“Ingrese valor [“<<i<<“][“<<j<<“]: “;

        cin>>matriz[i][j];

        }

        }

        cout<<“————————————————“<<endl;

        cout<<“Matriz original: “<<endl;

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

        for(int j = 0; j < columnas; j++){

        cout<<matriz[i][j];

        }

        cout<<endl;

        }

        cout<<“————————————————“<<endl;

        cout<<“Matriz transpuesta: “<<endl;

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

        for(int j = 0; j < filas; j++){

        cout<<matriz[j][i];

        }

        cout<<endl;

        }

        cout<<endl;

        if(filas == columnas){

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

        for(int j = 0; j < columnas; j++){

        if(matriz[i][j] == matriz[j][i]){

        condicion = ‘V’;

        }

        }

        }

        }else{

        cout<<“La matriz no es cuadrada por lo tanto: “<<endl;

        }

        if(condicion == ‘V’){

        cout<<“La matriz es simetrica.”;

        }else{

        cout<<“La matriz no es simetrica.”;

        }

        cout<<endl;

        return 0;

        }

  • Angel Sánchez

    organizador
    19 diciembre, 2019 en 4:23 am

    Hola Paola,

    Ya verifique tu código y entre el error, te lo explico: en el if donde vas comparando si los valores son iguales “if(matriz[i][j] == matriz[j][i])” si esto se cumple colocas la bandera de verdadero, pero no regresas la bandera a falso cuando pasa lo contrario, por ende con que un solo valor sea igual tu marcas la matriz como simétrica.

    Se pensaría que con solo poner un “else” y cambiar la bandera a falso se arregla esto, pero no es así, ya que vas comparando valor por valor, y si el ultimo valor si es igual la bandera se quedara cono verdadero aunque exista un valor que no sea igual. Así que la solución te la dejo de tarea.

    Yo he colocado “exit(-1);” para hacer funcionar el programa, pero solo lo hice para que lo vieras funcionando correctamente, hay que cambiar esos “exit(-1);” por algo más que solucione tu problema.

    P.D. Desde un inicio nos podemos dar cuenta si una matriz no es simétrica ya que no es cuadrada, así que si identificamos desde el inicio que no es cuadrada no hay necesidad de seguir.(Es la modificación de la linea 21).

    • Paola Vega Oviedo

      Miembro
      19 diciembre, 2019 en 12:16 pm

      Muchas gracias, eso fue gran ayuda. Entonces al poner exit(-1) en cuanto un solo coeficiente no sea verdadero se sale del for y marca el resultado?

      • Angel Sánchez

        organizador
        19 diciembre, 2019 en 4:24 pm

        Si, el exit(-1) hace que termine el programa. Ya que para que una matriz sea simetría todas las comparaciones deben de ser iguales, así que basta con que un solo valor no sea igual para determinar que no es una matriz simétrica.

  • Adrian de la Cruz Espinosa Zurita

    Miembro
    2 febrero, 2020 en 8:35 pm

    Hola, me agrada que este foro de seguimiento a dudas de los ejercicios.

    Me encontré con esta problemática igual y deseo compartir la solución que le di. (acepto ideas jeje):

    Primero me di cuenta que cualquier matriz cuadrada al transponerse, su último valor siempre sera igual , por eso el ejercicio siempre daba ‘V’ en la ultima comprobación de las matrices.

    Ejemplo:

    Matriz Original       Matriz Transpuesta

    [1] [3]  [7]               [1] [4] [7]        ¿Lo ven? El 2 esta en la misma casilla final. 

    [4] [8] [9]               [3] [8] [5]         Los For invierten las filas y columnas  al evaluar

    [7] [5] [2]                [7] [9] [2]         las matrices, pero siempre dejan de ultimo esa

                                                              casilla Final al momento de comparar. 

    Segundo: Acá dejo de mi código de solución al ejercicio, espero ser claro, y cualquier aportación, consejo, tip, lo agradecería con mucho gusto.  Saludos.

    ——————-Inicia código del ejercicio———————–

    #include <iostream>

    using namespace std;

    int main() {

     int renglon=0,columna=0,error=0;

     //Use un do while para realizar por lo menos una vez la peticion del tamano de la matriz.

     //En caso de no ser cuadrada la matriz, solicitara nuevamente el tamano de la matriz(fila/columna)

     do{

     if(error==1){ //Mensaje de error que se activa al repetirse el while.

     cout<<“Error, las columnas deben ser del mismo numero de los renglones, inserte de nuevo   los valores: “<<endl;

     }

    cout<<“Inserta la cantidad de renglones de la matriz: “;

    cin>>renglon;

    cout<<“Inserte la cantidad de columnas de la matriz: “;

    cin>>columna;

    error=1; //Puse esta variable error, para que en caso de que se vuelva a pedir el tamaño de la matriz

    cout<<endl<<endl; // se muestre un mensaje de error y solicitar insertar otra vez los datos.

    }while(columna!=renglon);

    int matriz1[renglon][columna]={};

    int casillas=renglon*columna; //Cree dos variables, la primera indica el numero de casillas que tendra la matriz

    int suma=0;// por ejemplo si es de 3*3 dara 9 casillas.

    cout<<“Favor de ingresar los valores correspondientes: “<<endl;

    for(int r=0;r<=renglon-1;r++){

    for(int c=0;c<=columna-1;c++){

    cout<<“Ingrese el valor [“<<r<<“][“<<c<<“]: “;

    cin>>matriz1[r];

    }

    }

    /*

    Mi solucion es esta, cuando se compara la matriz original con la transpuesta, se hace casilla por casilla, si todas son

    iguales, querra decir que la matriz es simetrica, por ende si TODAS SON IGUALES, se irá sumando un 1 en la variable suma,

    esto quiere decir que al finalizar el recorrido de la matriz, o sea, revisar todas sus CASILLAS, el total de los unos sumandos

    sera igual al total de casillas de la matriz. Es decir, si la matriz es de 2 filas por 2 columnas, dará 4 casillas, si las 4

    casillas al ser evaluadas con su matriz transpuesta son iguales, se sumara un 1 en cada una dando un total de 4.

    O sea: Casillas=4…. Suma=4

    Si alguna casilla no fuera igual, no se sumara nada, por ende suma y casillas sera diferentes y no se cumpliara la condicion

    del IF para indicar que es simetrica.

    */

    for(int r=0;r<=renglon-1;r++){

    for(int c=0;c<=columna-1;c++){

    if(matriz1[r]==matriz1[r]){

    suma+=1; // cuando son iguales se suma un 1 a Suma.

    }

    }

    }

    if(casillas==suma){ //Si son iguales las casillas de la matriz al numero de aciertos evaluados en la transposicion, dara MAtriz Simetrica.

    cout<<endl<<“Si es simetrica la matriz”;

    }else{

    cout<<endl<<“No es si metrica la matriz”;

    }

    return 0;

    }

    —————-Fin del ejercicio——————————–

    Pd. Al copiar acá,no me respeto el identado de mi código, por ello decidí ponerlo en 

    imágenes para mayor claridad.

  • Paola Vega Oviedo

    Miembro
    3 febrero, 2020 en 9:02 pm

    Es bueno, saber dar distintas soluciones a un mismo problema. Por cierto buena idea con cada que se sume uno cada que cumple la condición

  • Diego Don

    Miembro
    21 julio, 2020 en 11:15 pm

    Hola a Todos!

    Antes que nada, y agradeciendo nuevamente el curso gratuito, iba a publicar una discusión aparte pero me puse a buscar y encontré esta en referencia al tema del ejemplo 5 de matrices (Lección 14, Tema 7: https://www.azulschool.net/topic/ejemplo-5-saber-si-una-matriz-es-simetrica/)

    Entiendo, y espero me indiquen si comparten o no lo que digo, que el ejemplo que se muestra en el video, en cuanto al valor que se asigna a la variable condicion de la línea 31, siempre va a terminar quedando en V sea cual fuera los datos de la matriz y siempre y cuando sea cuadrada.

    ¿Por qué digo esto?:

    1. Los ciclos FOR anidados de las líneas 29 y 30, comienzan y terminan en (0,0) y (fila-1,columna-1), por lo cual, por más que tenga cualquier matriz cuadrada transpuesta, siempre esos valores pertenecen a las “puntas” de la diagonal y nunca cambiarán de lugar con respecto a la matriz original.
    2. Como la condición del IF en la línea 30 es de igualdad y solo va cambiando el valor de condicion dentro de los FOR anidados pero sin dejar de recorrer/comparar toda la matriz, siempre termina en (fila-1,columna-1)=(columna-1,fila-1), generando que siempre termine en V y, finalmente, indicando que la matriz es simétrica.
    3. En el ejemplo del video solo se tomó una matriz que no era cuadrada para indicar que no era simétrica (Paso que comprobaría al comienzo para avisar al usuario que ya no será posible que sea simétrica dado que no es cuadrada), y luego se toma como ejemplo de aplicación una matriz que, de antemano, se sabe que es simétrica.
    4. Si prueban cargar una matriz con valores aleatorios (que no coincidan justamente con una matriz simétrica), el programa de ejemplo seguirá indicando que es simétrica por lo antes mencionado.

    Por favor, si hay algo en lo que me equivoco y comprendí mal, háganmelo saber y aprovecho a su vez para compartirles mi código donde cambié la condición para que, si la comparación ya es distinta, no siga recorriendo el ciclo FOR e indique que no es simétrica (Usé el break que, de paso, me gustaría saber si estaría bien aplicado), también agregué la impresión de ambas matrices para que se vea fácilmente el resultado de la transpuesta (En cuanto a verificar que ya no podrá ser simétrica al comienzo del programa si fila!=columna, no lo modifiqué en cuanto al ejemplo y solo agregué una nota en la línea 70):

    https://onlinegdb.com/r1mro4Blw

    Desde ya, agradezco sus comentarios.

    Saludos!

    Ejemplo 5.- Saber si una matriz es simétrica.

  • Paola Vega Oviedo

    Miembro
    29 julio, 2020 en 2:53 pm

    Si, justamente todo lo que acabas de mencionar es correcto. Smiley

Inicia sesión para responder.

Start of Discussion
0 de 0 respuestas Junio 2018
Ahora