Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 27 Junio 2013, 20:43 pm



Título: Matriz Triangular Superior
Publicado por: m@o_614 en 27 Junio 2013, 20:43 pm
Saludos tengo el siguiente codigo que me tiene que decir si una matriz es triangular superior ( o sea que todos los elementos por debajo de la diagonal sean 0)

Código
  1. // Matriz Triangular Superior
  2. int tri_sup = 1;
  3.    for(i=0;i < n-1;i++)
  4.    {
  5.        for(j=n-1;j > 0+i;j--)
  6.        {
  7.            if(matriz[j][i] == 0)
  8.                tri_sup = 1;
  9.            else
  10.                tri_sup = 0;
  11.        }
  12.    }/*
pero el problema es que cuando le ingreso una matriz que no es Triangular Sup, me aparece que si lo es. Y no tengo idea de donde podria estar el error

de antemano gracias


Título: Re: Matriz Triangular Superior
Publicado por: engel lex en 27 Junio 2013, 21:21 pm
asumo que n es el lado de la matriz...
un ejercicio mental para ver como corre

1 2 3
0 1 2
0 0 1

tu algoritmo solo recorre los valores
[2][0]
[1][0]
[2][1]
es decir si el valor m(2,1) es 0 eso es correcto... los otros no importan, esto sin importar el tamaño de la matriz...

ya que si la matriz es
1 2 3
1 2 3
1 0 3
eso será valido, eso pasa porque no arrastras una valor para medir, sino que simplemente lo alteras como quieres...

mejor has

Código
  1. int tri_sup = 1;
  2.    for(i=0;i < n-1;i++)
  3.    {
  4.        for(j=n-1;j > 0+i;j--)
  5.        {
  6.            if(matriz[j][i] == 0)
  7.                tri_sup *= 1;
  8.            else
  9.                tri_sup *= 0;
  10.        }
  11.    }
  12.  
  13.  

(a*=b,  quiere decir a=a*b)

en ese caso si algún valor es incorrecto tri_sup se multiplicará por 0, y todo lo consecuente será 0


Título: Re: Matriz Triangular Superior
Publicado por: ecfisa en 27 Junio 2013, 21:46 pm
Hola m@o_614.

Código
  1. ...
  2. #define MAX_COL  ...
  3. #define MAX_ROW ...
  4.  
  5. int IsTriangSup(int mat[][MAX_COL])
  6. {
  7.  int f, r, sup = 1;
  8.  
  9.  for(f = 0; f < MAX_ROW; f++)
  10.    for(r = 0; r < MAX_COL; r++)
  11.      if(f > r && mat[f][r] != 0)
  12.        sup = 0;
  13.  
  14.  return sup;
  15. }
  16.  
  17. int main()
  18. {
  19.  int mat[MAX_ROW][MAX_COL];
  20.  ...
  21.  if (IsTriangSup(mat)) {
  22.  ...
  23. }
  24.  

Saludos :)


Título: Re: Matriz Triangular Superior
Publicado por: m@o_614 en 28 Junio 2013, 05:28 am
Muchas gracias

ya pude averiguar cual era el fallo del codigo


Código
  1. int tri_sup =1;
  2. for(i=0;i < n-1;i++)
  3.    {
  4.        for(j=n-1;(j > 0+i)&&(tri_sup);j--)
  5.        {
  6.            if(matriz[j][i] == 0)
  7.                tri_sup = 1;
  8.            else
  9.                tri_sup = 0;
  10.        }
  11.    }
  el problema de que no me marcaba bien si era triangular superior o no era porque aunque el ciclo ya me habia indicado que no era triangular superior por que algun miembro (matriz[j]) que esta debajo de la diagonal no era 0, el ciclo no se terminaba seguia y seguia, la manera que encontre de solucionarlo ps fue poniendo una bandera en la condicion de que terminara el ciclo cuando tri_sup == 0

engelx n significaba el tamanio de la matriz



Título: Re: Matriz Triangular Superior
Publicado por: satu en 28 Junio 2013, 11:20 am
Buenas!!

m@o_614 tu código se puede mejorar un pelín:

Código
  1. int tri_sup =1;
  2. for(i=0;i < n-1;i++)
  3.   {
  4.    for(j=n-1;(j > 0+i)&&(tri_sup);j--)
  5.       {
  6.        if(matriz[j][i] != 0)
  7.            tri_sup = 0;
  8.        }
  9.    }

Ya estás asumiendo al principio que es triangular superior (tri_sup = 1), entonces solo debes controlar el caso que cambie eso (matriz[ j][ i] != 0)

Saludetes


Título: Re: Matriz Triangular Superior
Publicado por: eferion en 28 Junio 2013, 11:34 am
A mi me rechina un poco en el segundo for la instrucción

Código
  1. (j > 0+i)

Funcionar funcionará... pero ese for no queda más claro así?

Código
  1. for(j=n-1;(j > i)&&(tri_sup);j--)

y luego lo que dice satu, ese if else sobra también. Dado que tri_sup tiene un valor inicial 1, el bucle solo debería preocuparse de darle valor 0 cuando proceda... volver a poner un 1 es absurdo, te hace poner más líneas de código que no solo no aportan nada sino que a la larga dificultan la lectura del código.


Título: Re: Matriz Triangular Superior
Publicado por: engel lex en 28 Junio 2013, 18:21 pm
en ese caso en vez de poner tantas condiciones al for no es más facil un break y listo? XD


Título: Re: Matriz Triangular Superior
Publicado por: rir3760 en 28 Junio 2013, 18:41 pm
Otra forma de verificar si una matriz cuadrada es triangular superior:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num [3][3] = {
  7.      {1, 2, 3},
  8.      {0, 5, 6},
  9.      {0, 0, 9}
  10.   };
  11.   int N = 3;
  12.   int i;
  13.   int j;
  14.  
  15.   i = 1;
  16.   j = 0;
  17.   while (i < N && num[i][j] == 0)
  18.      if (++j == i){
  19.         i++;
  20.         j = 0;
  21.      }
  22.   printf("Es triangular superior? %s\n", i == N ? "Si" : "No");
  23.  
  24.   return EXIT_SUCCESS;
  25. }

Un saludo


Título: Re: Matriz Triangular Superior
Publicado por: engel lex en 28 Junio 2013, 18:57 pm
rir3760

me gustó mucho tu solucion, es un poco rara a primera vista, pero se ve perfecta... pocas lineas, un solo ciclo...


Título: Re: Matriz Triangular Superior
Publicado por: m@o_614 en 30 Junio 2013, 19:28 pm
muchas gracias, ya le hice los cambios que me dijeron y funciona perfecto  :D