› Foros › PC › Software libre
Error durante ejecucion escribió:cm0151:~/Desktop/Programacion DSurf$ ./a.out
Filas de la matriz: 3
Columnas de la matriz: 3
Escribe los numeros de la matriz: 3
Escribe los numeros de la matriz: 5
Escribe los numeros de la matriz: 6
Escribe los numeros de la matriz: 2
Escribe los numeros de la matriz: 9
Escribe los numeros de la matriz: 76
Escribe los numeros de la matriz: 54
Escribe los numeros de la matriz: 32
Escribe los numeros de la matriz: 12
Determinante = Segmentation fault
PROGRAM Matriz (INPUT, OUTPUT);
{$ extended-pascal}
TYPE
tArray (Fila, Colum: INTEGER) = ARRAY [1..Fila, 1..Colum] OF REAL;
tpArray = ^tArray;
VAR
Matriz1, Matriz2: tpArray;
PROCEDURE ObtenerLongMatriz (VAR Matriz: tpArray);
VAR
Filas, Colum: INTEGER;
BEGIN
WRITE ('Filas de la matriz: ');
READLN (Filas);
WRITE ('Columnas de la matriz: ');
READLN (Colum);
new (Matriz, Filas, Colum);
END; {Fin procedimiento Obtener longitud matriz}
PROCEDURE ObtenerNumMatriz (VAR Matriz: tpArray);
VAR
contFila, contColum: INTEGER;
BEGIN
FOR contFila := 1 TO Matriz^.Fila DO
FOR contColum := 1 TO Matriz^.Colum DO BEGIN
WRITE ('Escribe los numeros de la matriz: ');
READLN (Matriz^ [contFila, contColum]);
END;
END;{Fin procedimiento Obtener numeros matriz}
PROCEDURE Det (PROTECTED VAR Matriz: tpArray);
FUNCTION Determinante (PROTECTED VAR Matriz: tpArray; Rango: INTEGER): REAL;
VAR
contFila, contColum, Ncolum: INTEGER;
esc1, esc2, esc3, esc4, esc: REAL;
deter: REAL;
MatrizAux: tpArray;
BEGIN
IF (Matriz^.Fila = 2) AND (Matriz^.Fila = 2) THEN
BEGIN
esc1 := Matriz^ [1,1];
esc2 := Matriz^ [2,2];
esc3 := Matriz^ [1,2];
esc4 := Matriz^ [2,1];
Determinante := (esc1 * esc2) - (esc3 * esc4);
END {Fin del IF}
ELSE
BEGIN
deter:= 0;
FOR Ncolum:= 1 TO Rango DO
{ A continuacion meto en la Matriz Auxiliar (MatrizAux)
los valores que quedan eliminando la fila y la columna
correspondientes de la Matriz principal (Matriz1) }
FOR contFila := 2 TO Rango DO BEGIN
FOR contColum := 1 TO (Ncolum - 1) DO
MatrizAux^ [contFila - 1, contColum] := Matriz^[contFila, contColum];
FOR contColum := Ncolum + 1 TO Rango DO
MatrizAux^ [contFila - 1, contColum - 1] := Matriz^[contFila, contColum];
END;{Fin del FOR}
IF (1 + Ncolum) MOD 2 = 0 THEN { Con este IF-ELSE }
contFila := 1 { averiguamos el signo }
ELSE { de complementario }
contFila := -1;
esc := Matriz^ [1, Ncolum];
deter := deter + contFila * esc * determinante (MatrizAux, Rango - 1); {Llamada recursiva de la funcion}
determinante := deter;
END; {Fin del ELSE}
END; {Fin FUNCION Determinante}
VAR
Rango: INTEGER;
MatrizAux: tpArray;
BEGIN
IF (Matriz^.Fila > 1) AND (Matriz^.Fila = Matriz^.Colum) THEN
BEGIN
Rango := Matriz^.Fila;
WRITELN ('Determinante = ', Determinante (Matriz, Rango):2);
END
ELSE IF (Matriz^.Fila = 1) AND (Matriz^.Colum = 1) THEN
WRITELN ('El determinante vale: ', Matriz^ [1,1]:2)
ELSE
WRITELN ('La matriz no es cudrada');
END; {Fin PROCEDIMIENTO Det}
BEGIN
ObtenerLongMatriz (Matriz1);
ObtenerNumMatriz (Matriz1);
Det (Matriz1);
END.