Pascal/Turbo Pascal - Verificar si una matriz es diagonal

 
Vista:
sin imagen de perfil

Verificar si una matriz es diagonal

Publicado por Maxi (3 intervenciones) el 17/10/2013 21:03:56
Hola a todos, necesito ayuda para optimizar la solución de un problema. El problema consiste en hacer una función que verifique si una matriz es diagonal o no (matriz diagonal: todos sus elementos excepto los que están situados en la diagonal principal deben ser ceros, pudiendo ser los de la diagonal ceros o no).

Yo hice esta función usando dos ciclos for, la cual devuelve el resultado esperado:

function verificarSiEsDiagonal(rango:integer;var matriz:tmatriz):boolean;
{Esta funcion verifica si la matriz ingresada es diagonal o no; en caso que lo sea devuelve true,
caso contrario devuelve false.}
1
2
3
4
5
6
7
8
9
var i,j:integer;
begin
	for i:=1 to rango do
	begin
		for j:=1 to rango do
			if (i<>j) then
				if (matriz[i,j]<>0) then verificarSiEsDiagonal:=false;
	end;
end;

Pero si quisiera optimizarla, y que no recorra elemento por elemento (de los que no están en la diagonal) para decir si la matriz es diagonal o no, ¿cómo podría hacerlo usando dos while o dos repeat? Algo que sea, mientras i<>j y matriz[i,j]<>0, verificarSiEsDiagonal:=false.

Yo hice este intento pero no funciona:

function verificarSiEsDiagonal(rango:integer;var matriz:tmatriz):boolean;
{Esta funcion verifica si la matriz ingresada es diagonal o no; en caso que lo sea devuelve true,
caso contrario devuelve false.}
1
2
3
4
5
6
7
8
9
10
11
12
var i,j:integer;
begin
	i:=1;
	j:=1;
	while (i<>j) do
	begin
		while (i<=rango) and (j<=rango) do
		begin
			if (matriz[i,j]<>0) then verificarSiEsDiagonal:=false;
		end;
	end;
end;

Si alguien pudiera ayudarme sería de gran ayuda!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Verificar si una matriz es diagonal

Publicado por ramon (2158 intervenciones) el 19/10/2013 16:15:44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
{Mira esto a ver si te ayuda}
 
{Segun tu anunciadi esto tendria que ser confirmando que
  el resto es cero este programa lo verifica pruevalo.
  [matriz diagonal: todos sus elementos excepto los que están
  situados en la diagonal principal deben ser ceros]}
 
  program diagonal;
  uses
     crt;
  const
     b = 5;
     z = 5;
  var
    matriz : array[1..b,1..z] of integer;
    n, t, x, y : integer;
 
 
   procedure rellena;
   begin
      n := 1;
    repeat
       for t := n to b - 1 do
       matriz[t + 1,n] := 0;
       for x := n to b - 1 do
       matriz[n,x + 1] := 0;
       matriz[n,n] := 1;
       n := n + 1;
    until n > b;
    for t := 1 to b do
    begin
     for y := 1 to z do
     begin
        write(' ',matriz[y,t]);
     end;
        writeln;
      end;
   end;
 
   function esdiagonal : boolean;
   begin
       esdiagonal := true;
       x := 0;
       y := 0;
       for n := 1 to b do
       begin
         for t := n + 1 to z do
         begin
         x := x + matriz[t, n];
         y := y + matriz[n, t];
         end;
         if (x >= matriz[n,n]) or (y >= matriz[n,n]) then
         esdiagonal := false;
         x := 0;
         y := 0;
      end;
   end;
 
   begin
       clrscr;
       rellena;
       writeln;
       writeln('  Lamatriz Es Diagonal = ',esdiagonal);
       writeln;
       writeln('  Modificamos Y ');
       matriz[z,z - 1] := 1;
       writeln;
       for t := 1 to b do
       begin
         for y := 1 to z do
         begin
        write(' ',matriz[y,t]);
         end;
        writeln;
      end;
       writeln;
       writeln('  Lamatriz Es Diagonal = ',esdiagonal);
       readkey;
   end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Verificar si una matriz es diagonal

Publicado por Maxi (3 intervenciones) el 19/10/2013 18:55:56
Gracias por tu ayuda ramon, igualmente, lo que yo decia es en la funcion que llamaste esdiagonal no usar ningún for. Algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Function EsDiagonal (Matriz : tMatriz) : Boolean;
 
Var
    i,j      : tRangoMatriz;
    Cancelar	: Boolean;
Begin
    Cancelar	:= False;
 
    J := 1;
    Repeat
        i	:= 1;
 
        While (Not Cancelar) and (i<>j) Do
            Begin
					If (Matriz[i,j]<>0) then
                    Begin
                        Cancelar := true;
                        Inc(i);
                    End
           End;
        Inc(j);
        Until ((Cancelar) or ((j=nMax) and (i=nMax)));
 
        EsDiagonal := Not Cancelar;
End;

Pero no se que hacer con la condicion del until, la que escribi yo falla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Verificar si una matriz es diagonal

Publicado por ramon (2158 intervenciones) el 20/10/2013 17:48:45
Mira en la zona until te sobra esto (i=nMax)) puesto que lo tienes controlado en while.
veo que recorres toda la matriz asin que si la diagonal tiene valor mayor de cero te dará
que no es diagonal que según tu tiene que tener todo 0 menos la diagonal por lo cual
te dará error.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Function EsDiagonal (Matriz : tMatriz) : Boolean;
 
Var
i,j : tRangoMatriz;
Cancelar	: Boolean;
Begin
Cancelar	:= False;
 
J := 1;
Repeat
i	:= 1;
 
While (Not Cancelar) and (i<>j) Do
Begin
If (Matriz[i,j]<>0) then
Begin
Cancelar := true;
Inc(i);
End
 
End;
 
 
Inc(j);
Until ((Cancelar) or ((j=nMax) and (i=nMax)));

fíjate en ello.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Verificar si una matriz es diagonal

Publicado por ramon (2158 intervenciones) el 20/10/2013 18:08:24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{Mira Este Cambio}
 
 function esdiagonal : boolean;
   var
      diag : boolean;
   begin
       diag := true;
       x := 0;
       y := 0;
       n := 1;
    repeat
         t := n + 1;
         repeat
         x := x + matriz[t, n];
         y := y + matriz[n, t];
         t := t + 1;
         until t > z;
         if matriz[n,n] = 0 then
          matriz[n,n] := 1;
         if (x >= matriz[n,n]) or (y >= matriz[n,n]) then
         diag := false;
         x := 0;
         y := 0;
         n := n + 1;
      until (n > b) or (diag = false);
      esdiagonal := diag;
   end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Verificar si una matriz es diagonal

Publicado por Maxi (3 intervenciones) el 21/10/2013 03:18:21
Muchas gracias ramon! Me fue de mucha ayuda tu participación!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar