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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matriz Triangular Superior
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Matriz Triangular Superior  (Leído 25,924 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Matriz Triangular Superior
« 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


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #1 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


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #2 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 :)
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #3 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

En línea

satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: Matriz Triangular Superior
« Respuesta #4 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
En línea

Breakbeat como forma de vida
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #5 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.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #6 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
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #7 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
En línea

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
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #8 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...
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Matriz Triangular Superior
« Respuesta #9 en: 30 Junio 2013, 19:28 pm »

muchas gracias, ya le hice los cambios que me dijeron y funciona perfecto  :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines