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
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
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
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 :)
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
Buenas!!
m@o_614 tu código se puede mejorar un pelín:
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
A mi me rechina un poco en el segundo for la instrucción
(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.
en ese caso en vez de poner tantas condiciones al for no es más facil un break y listo? XD
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
rir3760
me gustó mucho tu solucion, es un poco rara a primera vista, pero se ve perfecta... pocas lineas, un solo ciclo...
muchas gracias, ya le hice los cambios que me dijeron y funciona perfecto :D