Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DickGumshoe en 4 Marzo 2012, 21:44 pm



Título: Guardar la segunda diagonal de una matriz
Publicado por: DickGumshoe en 4 Marzo 2012, 21:44 pm
Hola.

Estoy haciendo un ejercicio que tiene este enunciado:

"Escribir un programa que pida al usuario los datos de una matriz de tamaño 3x3, y
guarde en un vector la diagonal principal, y en otro la otra diagonal."

Tengo guardada en un vector la diagonal "Principal". Sin embargo, no se me ocurre cómo guardar la otra diagonal. Sé que tengo que obtener los números de la fila 0, columna 2; fila 1, columna 1; fila 2, columna 0. Pero no sé cómo hacerlo (me refiero a hacerlo con un bucle for, no a guardar de decir "diagonal2 = M[0][2] y eso).

Lo que tengo por ahora es:

Código
  1. /* Escribir un programa que pida al usuario los datos de una matriz de tamaño 3x3, y
  2. guarde en un vector la diagonal principal, y en otro la otra diagonal. */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. int main()
  8. {
  9.    int i, j, aux, numero;
  10.    int M[3][3];
  11.    int diagonal1[3], diagonal2[3];
  12.  
  13.    for(i=0;i<3;i++)
  14.    {
  15.       for(j=0;j<3;j++)
  16.       {
  17.          printf("COLUMNA: %d\nFILA: %d\nNumero: ", i+1, j+1);
  18.          scanf("%d", &M[i][j]);
  19.          printf("\n");
  20.       }
  21.    }
  22.  
  23.    for(i=0;i<3;i++) diagonal1[i] = M[i][i];
  24.    //diagonal2 = ?
  25.  
  26.    printf("La primera diagonal es:\n");
  27.    for(i=0;i<3;i++) printf("%d ", diagonal1[i]);
  28.    printf("y la segunda:\n");
  29.    for(i=0;i<3;i++) printf("%d ", diagonal2[i]);
  30.  
  31.    system("pause");
  32.    return 0;
  33. }
  34.  

Muchísimas gracias.
Saludos.


Título: Re: Guardar la segunda diagonal de una matriz
Publicado por: Xandrete en 4 Marzo 2012, 23:23 pm
Oh, en general, para una matriz mat cuadrada de orden M.

El primer elemento de la diagonal secundaria es mat[0][M-1], el segundo es mat[1][M-2]... y el último es mat[M-1][0]. A partir de esto se puede extraer el patrón. Sea mat[ i ][ j ] un elemento de la diagonal secundaria. Si i va de 0 a M-1, j va de M-1 a 0. Podemos expresar j como función de i: j = M-1-i.

Comprobamos:
-Cuando i = 0, j = M-1-0 = M-1 -> correcto
-Cuando i = 1, j = M-1-1 = M-2 -> correcto
...
-Cuando i = M-1, j = M-1-(M-1)=0 -> correcto.

Por ende, podemos utilizar el siguiente bucle para recorrer la diagonal secundaria:

Código
  1. for (i = 0; i < M; ++i) foo(mat[i][M-1-i]);

Donde foo() es una función o código arbitrario.

Saludos.


Título: Re: Guardar la segunda diagonal de una matriz
Publicado por: DickGumshoe en 4 Marzo 2012, 23:59 pm
Muchas gracias, Xandrete.

He entendido bien la explicación, sin embargo, estoy intentando no hacer uso de funciones. ¿No hay ninguna forma de hacerlo sin "foo"?

Gracias.

Saludos.


Título: Re: Guardar la segunda diagonal de una matriz
Publicado por: rir3760 en 5 Marzo 2012, 00:42 am
El uso de la función "foo" en el fragmento de Xandrete es solo ilustrativo, el ya lo indica así al final de su mensaje:
Cita de: Xandrete
Donde foo() es una función o código arbitrario.

Un saludo


Título: Re: Guardar la segunda diagonal de una matriz
Publicado por: Xandrete en 5 Marzo 2012, 10:37 am
El uso de la función "foo" en el fragmento de Xandrete es solo ilustrativo, el ya lo indica así al final de su mensaje:
Un saludo

Exacto. ¡Gracias ;D!
Por cierto, he editado el código. Había puesto M[ i ][ M-i-1 ] en lugar de mat[ i ][ M-i-1 ].

Saludos


Título: Re: Guardar la segunda diagonal de una matriz
Publicado por: DickGumshoe en 5 Marzo 2012, 18:54 pm
Muchas gracias a los dos.

Saludos.