Guardar la segunda diagonal de una matriz

Iniciado por DickGumshoe, 4 Marzo 2012, 21:44 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

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:


/* 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. */

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i, j, aux, numero;
   int M[3][3];
   int diagonal1[3], diagonal2[3];
   
   for(i=0;i<3;i++)
   {
      for(j=0;j<3;j++)
      {
         printf("COLUMNA: %d\nFILA: %d\nNumero: ", i+1, j+1);
         scanf("%d", &M[i][j]);
         printf("\n");
      }
   }
   
   for(i=0;i<3;i++) diagonal1[i] = M[i][i];
   //diagonal2 = ?
   
   printf("La primera diagonal es:\n");
   for(i=0;i<3;i++) printf("%d ", diagonal1[i]);
   printf("y la segunda:\n");
   for(i=0;i<3;i++) printf("%d ", diagonal2[i]);
   
   system("pause");
   return 0;
}


Muchísimas gracias.
Saludos.

Xandrete

#1
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 (cpp) [Seleccionar]
for (i = 0; i < M; ++i) foo(mat[i][M-1-i]);

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

Saludos.

DickGumshoe

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.

rir3760

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: XandreteDonde foo() es una función o código arbitrario.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Xandrete

#4
Cita de: 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:
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

DickGumshoe