(* file determin.pas *)
(* scopo: calcolo determinante di una matrice quadrata di dimensione
massima fissata *)
program CalcolaDeterminante;
const NMAX = 10; (* massima dimensione della matrice *)
type Matrice = array [1..NMAX,1..NMAX] of integer;
RecMatrice = record
mat: Matrice;
dim: 1..NMAX;
end;
procedure LeggiMatrice (var matrice: RecMatrice);
{ Legge una matrice da file. }
var
nome : string; { nome del file dal quale leggere la matrice }
f : text; { file logico }
i, j : integer;
begin { LeggiMatrice }
write('Nome del file dal quale leggere la matrice ? ');
readln(nome);
assign(f, nome);
reset(f);
read(f,matrice.dim);
for i := 1 to matrice.dim do
for j := 1 to matrice.dim do
read(f, matrice.mat[i,j]);
close(f)
end; { LeggiMatrice }
procedure StampaMatrice (matrice: RecMatrice);
{ Stampa una matrice su video. }
var i, j : integer;
begin { StampaMatrice }
for i := 1 to matrice.dim do
begin
for j := 1 to matrice.dim do
write(matrice.mat[i,j]:7);
writeln
end;
writeln
end; { StampaMatrice }
function Determinante(matrice: RecMatrice): integer;
procedure Minore(j:integer; matrice_in: RecMatrice;
var matrice_out: RecMatrice);
(* restituisce in matrice_out il j-esimo minore di matrice_in =
il minore relativo all'elemento di riga 1, colonna j *)
var riga, colonna_in, colonna_out: integer; (* necessari per i cicli *)
begin (* Minore *)
matrice_out.dim := matrice_in.dim - 1;
(* il minore ha dimensione inferiore di 1 rispetto alla matrice
di input *)
// sintassi C per il for che segue alla riga con questi simboli *?*? //
for ( riga = 2; riga <= matrice_in.dim; ) {
colonna_out = 1;
for ( colonna_in = 1; colonna_in <= matrice_in.dim ) {
if ( colonna_in != j ) {
matrice_out.mat[riga-1, colonna_out]= matrice_in.mat[riga, colonna_in];
colonna_out = colonna_out + 1;
}
}
}
*?*? for riga:= 2 to matrice_in.dim do
(* il ciclo esterno si occupa delle righe del minore.
La prima riga della matrice di input va saltata *)
begin
colonna_out:= 1;
for colonna_in := 1 to matrice_in.dim do
(* il ciclo interno si occupa delle colonne del minore *)
begin
if colonna_in <> j then
(* occorre saltare la colonna j-esima di matrice_in *)
begin
matrice_out.mat[riga-1,colonna_out]:=
matrice_in.mat[riga,colonna_in];
colonna_out := colonna_out +1;
end
end (* for interno *)
end (* for interno *)
fine *?*?
end; (* Minore *)
function Coefficiente(j: integer): integer;
(* restituisce 1 se j e' dispari; restituisce -1 se j e' pari *)
begin (* Coefficiente *)
if j mod 2 = 0 then
Coefficiente := -1
else
Coefficiente:= 1
end; (* Coefficiente *)
var somma, i : integer;
matrice_aux: RecMatrice;
begin (* Determinante *)
if matrice.dim = 1 then
Determinante := matrice.mat[1,1]
else if matrice.dim = 2 then
Determinante:= matrice.mat[1,1]*matrice.mat[2,2] -
matrice.mat[1,2]*matrice.mat[2,1]
else begin
somma:=0;
for i:= 1 to matrice.dim do
begin
Minore(i,matrice,matrice_aux);
somma:= somma +
matrice.mat[1,i] * Coefficiente(i) * Determinante(matrice_aux)
end;
Determinante := somma;
end;
end; (* Determinante *)
var m: RecMatrice;
begin { CalcolaDeterminante }
LeggiMatrice(m); { lettura della matrice }
writeln('Ho letto la matrice:');
StampaMatrice(m); { stampa di verifica su video }
writeln('Il suo determinante vale: ', Determinante(m));
end. { CalcolaDeterminante }