Matriz Triangular Superior

Iniciado por m@o_614, 27 Junio 2013, 20:43 PM

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

m@o_614

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)

// Matriz Triangular Superior
int tri_sup = 1;
    for(i=0;i < n-1;i++)
    {
        for(j=n-1;j > 0+i;j--)
        {
            if(matriz[j][i] == 0)
                tri_sup = 1;
            else
                tri_sup = 0;
        }
    }/*
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

engel lex

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 (cpp) [Seleccionar]

int tri_sup = 1;
   for(i=0;i < n-1;i++)
   {
       for(j=n-1;j > 0+i;j--)
       {
           if(matriz[j][i] == 0)
               tri_sup *= 1;
           else
               tri_sup *= 0;
       }
   }



(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
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

Hola m@o_614.


...
#define MAX_COL  ...
#define MAX_ROW ...

int IsTriangSup(int mat[][MAX_COL])
{
  int f, r, sup = 1;

  for(f = 0; f < MAX_ROW; f++)
    for(r = 0; r < MAX_COL; r++)
      if(f > r && mat[f][r] != 0)
        sup = 0;

  return sup;
}

int main()
{
  int mat[MAX_ROW][MAX_COL];
  ...
  if (IsTriangSup(mat)) {
  ...
}


Saludos :)

m@o_614

Muchas gracias

ya pude averiguar cual era el fallo del codigo



int tri_sup =1;
for(i=0;i < n-1;i++)
    {
        for(j=n-1;(j > 0+i)&&(tri_sup);j--)
        {
            if(matriz[j][i] == 0)
                tri_sup = 1;
            else
                tri_sup = 0;
        }
    }
  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


satu

Buenas!!

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

Código (cpp) [Seleccionar]

int tri_sup =1;
for(i=0;i < n-1;i++)
   {
    for(j=n-1;(j > 0+i)&&(tri_sup);j--)
       {
        if(matriz[j][i] != 0)
            tri_sup = 0;
        }
    }


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
Breakbeat como forma de vida

eferion

A mi me rechina un poco en el segundo for la instrucción

Código (cpp) [Seleccionar]
(j > 0+i)

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

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.

engel lex

en ese caso en vez de poner tantas condiciones al for no es más facil un break y listo? XD
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

Otra forma de verificar si una matriz cuadrada es triangular superior:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num [3][3] = {
      {1, 2, 3},
      {0, 5, 6},
      {0, 0, 9}
   };
   int N = 3;
   int i;
   int j;
   
   i = 1;
   j = 0;
   while (i < N && num[i][j] == 0)
      if (++j == i){
         i++;
         j = 0;
      }
   printf("Es triangular superior? %s\n", i == N ? "Si" : "No");
   
   return EXIT_SUCCESS;
}


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

engel lex

rir3760

me gustó mucho tu solucion, es un poco rara a primera vista, pero se ve perfecta... pocas lineas, un solo ciclo...
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

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