elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting (Moderadores: Leo Gutiérrez., Eleкtro)
| | |-+  Diagonal secundaria de matriz.!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Diagonal secundaria de matriz.!  (Leído 12,007 veces)
cuazzo

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Diagonal secundaria de matriz.!
« en: 21 Junio 2010, 03:32 »

Hola.. buscando ejercicios encontre uno que me dice imprimir la diagonal principal de una matriz, el cual me salio, hice lo siguiente:
Código:
m=int(raw_input("Ingrese el número de filas: "))
n=int(raw_input("Ingrese el número de columnas: "))


A=[]
for j in range(m):
  A.append([0]*n)
 
print "Lectura de la matriz A"
for j in range(m):
  for k in range(n):
    A[j][k] = float(raw_input("Dame el componente (%d,%d): " %(j+1,k+1)))
   
for i in A:
  print i


C=[]     
for k in range(m):
  for j in range(n):
    if k==j:
      C.append (A[j][k])
     
print  C

bien, ese salio, pero a la hora de querer imprimir la diagonal secundaria, no se que hacer, quiero encarar el ejercicio asi, empezando a recorrer la matriz de atrás para adelante o invirtiendo la matriz totalmente, pero no se me ocurre como hacerlo.


En línea

Leo Gutiérrez.
. . .. ... ..... ........ ............. .....................
Moderador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Diagonal secundaria de matriz.!
« Respuesta #1 en: 21 Junio 2010, 04:01 »

Bueno, yo no sé python, pero para sacar la diagonal principal tienes que hacer esto:

Suponiendo que tengamos una matriz (cuadrada) así:

Código:
1 2 3
4 5 6
7 8 9

La matriz diagonal secundaria es:
3, 5, 7

Utiliza un bucle en donde inicialices la variable indice a "dimension - 1", dicha variable indice va a ir en decremento, fijate como vas yendo de la columna 2 a la 1 y luego a la 0, es por eso que en decremento, luego, inicializa una variable indice a 0, para que vaya recorriendo las filas, esta otra variable indice debe de ir en incremento:

3 <- A[0][2]
5 <- A[1][1]
7 <- A[2][0]

Guiate de esto:

Código:
for(i = dimension - 1, filas = 0; i >= 0; i--, filas++)
        printf("%d\n", matriz[filas][i]);
   


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
plof

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Diagonal secundaria de matriz.!
« Respuesta #2 en: 21 Junio 2010, 05:54 »

Se nota que que has estado trabajando, lo que traes hoy tiene mejor pinta, estás preparado para la charla de la hormiguita. Imagina que una hormiguita recorre tu programa de arriba hacia abajo y por cada iteración del bucle da un pasito hacia delante.

En tu ejemplo de arriba:
Código
  1. A=[]
  2. for j in range(m):
  3.    A.append([0]*n)
  4.  
  5. for j in range(m):
  6.    for k in range(n):
  7.        A[j][k] = float(raw_input("Dame el componente (%d,%d): " %(j+1,k+1)))

Código
  1. j=0, j=1, j=2, ...la hormiguita da 3 pasos.
  2.  
  3. (j=0,k=0), (j=0,k=1), (j=0,k=2)
  4. (j=1,k=0), (j=1,k=1), (j=1,k=2)
  5. (j=2,k=0), (j=2,k=1), (j=2,k=2) ... la hormiguita da 9 pasos.
La hormiguita da un total de 12 pasos, (n*m)+m pasos.

Si incluyes la creación de cada fila del
array en el primer bucle anidado:
Código
  1. A=[]
  2. for j in range(m):
  3.    A.append([0]*n)
  4.  
  5.    for k in range(n):
  6.        A[j][k] = float(raw_input("Dame el componente (%d,%d): " %(j+1,k+1)))

Código
  1. (j=0,k=0), (j=0,k=1), (j=0,k=2)
  2. (j=1,k=0), (j=1,k=1), (j=1,k=2)
  3. (j=2,k=0), (j=2,k=1), (j=2,k=2) ... la hormiguita da 9 pasos.
La hormiguita da un total de 9 pasos, n*m.
Si te cuento ésto es porque la calidad del código se mide entre otras muchas cosas por el menor número de pasos que da la hormiguita a lo largo de tu programa.

Volviendo con la diagonal, fijate bien como la solución que propone Leo es sin duda mejor que el recorrido que propones tú para recorrer la diagonal del array, ademas que la idea de la diagonal es solo para 'matrices cuadradas' (n=m), cosa que tampoco compruebas.

Solución 1 (la hormiguita de m pasos)
Código
  1. if n == m:
  2.    for k in range(m):
  3.        C.append (A[k][k])

Solución 2 (la hormiguita de m*n pasos y está bastante mosqueada)
Código
  1. if n == m:
  2.    for k in range(m):
  3. for j in range(n):
  4.    if k==j:
  5. C.append (A[j][k])

Para la diagonal en el otro sentido Leo lo ha dejado más que resuelto, procura hacer lo mismo para la próxima vez, es decir, lo primero es entender lo que uno quiere hacer y luego ya se llevará a la práctica, primero diseñar y luego programar.

Siguiendo con el ejemplo de Leo...
Código
  1. La diagonal: (0,2) (1,1) (2,0)... la hormiguita DEBE dar 3 pasos, n o m (matriz cuadrada).
  2. m = 3
  3. n = 3 = 3
  4.  
  5. Bucle 0-2
  6. k = 0
  7. k = 1
  8. k = 2
  9.  
  10. eureka!!
  11. (0,2) (1,1) (2,0)
  12. (k,2) (k,1) (k,0)
  13.  
  14. uhmmm...pero faltan las columnas...a ver...
  15. k=0....necesito un 2
  16. k=1....necesito un 1
  17. k=2....necesito un 0
Si además sabemos que n y m valen siempre 3 en todo el recorrido, ¿se te ocurre algo?

Saludos.

pd.¿python en la sección de scripting? ¿en un foro de hacking?, si es porque no hay muchos posts lo podría apadrinar C/C++ , seguro que se llevan bien ;).
En línea

Novlucker
Ninja y
Moderador Global
***
Desconectado Desconectado

Mensajes: 10.684


Yo que tu lo pienso dos veces


Ver Perfil
Re: Diagonal secundaria de matriz.!
« Respuesta #3 en: 21 Junio 2010, 14:31 »

Solución 1, la hormiguita puede elegir otras formas y conocer nuevos mundos, es que la hormiguita puede elegir entre cuadrados o rectángulos :P , pero luego de la solución esta algo mosqueada, porque resulta que ahora ya no puede caminar tanto como antes :P

Citar
pd.¿python en la sección de scripting? ¿en un foro de hacking?, si es porque no hay muchos posts lo podría apadrinar C/C++ , seguro que se llevan bien.

Claro, si python es scripting ... y en un foro de seguridad

Saludos
« Última modificación: 21 Junio 2010, 14:33 por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

cbug

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Diagonal secundaria de matriz.!
« Respuesta #4 en: 21 Junio 2010, 17:01 »

Esta puede ser una solución:

Código
  1. ##Imprimo la diagonal secundaria
  2. C = []
  3. i = 0
  4. j = 0
  5. for i in range(n):
  6.    for j in range(m):
  7.        if(i + j == n - 1):
  8.            C.append(matriz[i][j])
  9. print(C)
En línea

plof

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Diagonal secundaria de matriz.!
« Respuesta #5 en: 22 Junio 2010, 01:05 »

Solución 1, la hormiguita puede elegir otras formas y conocer nuevos mundos ...
Teología de la hormiguita le llaman  :P.
Claro, si python es scripting ...
Estoy de acuerdo, solo creo que python aspira mucho más que sus compañeros de grupo  :rolleyes:.
...y en un foro de seguridad
Sin embargo se trabaja más con overflows que con netfilter... no se Novlucker,  no lo entiendo, me parece perfecto la imagen que quereis transmitir en el foro pero no doy con la fórmula de dónde y cómo se debe decir cada cosa.
La verdad es que prefiero no tocar el más tema, por mi parte evito las palabras clave y seguimos con arrays y el buen rollo que trae esta sección.

Esta puede ser una solución:

Código
  1. ##Imprimo la diagonal secundaria
  2. C = []
  3. i = 0
  4. j = 0
  5. for i in range(n):
  6.    for j in range(m):
  7.        if(i + j == n - 1):
  8.            C.append(matriz[i][j])
  9. print(C)
No necesitas iterar a lo largo de todo el array, la diagonal es única solamente para matrices cuadradas y éso nos da algo de ventaja.
Código
  1. if n==m:
  2.    for i in range(n):
  3.        C.append(A[i][m-i-1])

...o en versión 'package', igual de válida que la anterior:
Código
  1. n==m and [C.append(A[i][m-i-1]) for i in range(n)

Saludos.
En línea

cuazzo

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Diagonal secundaria de matriz.!
« Respuesta #6 en: 22 Junio 2010, 01:17 »

Hola de nuevo.! muchas muchas gracias por contestar!, son unos genios, anoche me quede hasta tarde y lo logre hacer, eso si, no tuve en cuenta la cantidad de pasos que hace la hormiguita, jaja, pero salio.!, de ahora en mas tmb voy a tratar que mis programas sean lo mas rapido posibles, les dejo el codigo para que me digan que tal:
Código:
D=[]     
if m==n:
 for k in range(m):
   for j in range(n):
     if k+j==len(A)-1 :
       D.append (A[j][k])
       print  D
else:
  print "La Matriz no es cuadrada"

Muchas muchas gracias.!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines