PDA

Ver la Versión Completa : determinante de una matriz


baby
31-05-2007, 11:27:37
hola a todos los copañeros del foro
haber si me podeis hechar la mano por fa en eso quiero calcular el dertminante de una matriz (3*3)que la tengo generada en un stringgrid pero nose como
meterle mano
gracias
saludos

Robert01
31-05-2007, 14:22:28
Hola

Aquí se calcula el determinante de una matriz usando TEdits creados en tiempo de ejecución, espero que te sirva, adaptalo a tus necesidades.


unit det;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
matriz2x21: TMenuItem;
matriz3x31: TMenuItem;
matriz4x41: TMenuItem;
matriznxn1: TMenuItem;
ScrollBox1: TScrollBox;
CalcularDeterminante: TMenuItem;
SeleccionarMatriz1: TMenuItem;
Calcular1: TMenuItem;
procedure matriz2x21Click(Sender: TObject);
procedure matriz3x31Click(Sender: TObject);
procedure matriz4x41Click(Sender: TObject);
procedure CalcularDeterminanteClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure matriznxn1Click(Sender: TObject);
private
{ Declaraciones privadas }
public
{ Declaraciones publicas }
procedure MatPress(Sender: TObject; var Key: Char);
end;

type mat=array[1..25,1..25]of integer; // Matriz

var
Form1: TForm1;
dim:Integer; // dimension de la Matriz
M:mat;
implementation

{$R *.DFM}

procedure Crear_Matriz(n:integer);
var
i,t:integer;
begin
for i:=0 to (n-1) do // va a hacer el cuadro del Tedit
for t:=0 to (n-1) do
with TEdit.Create(Form1.Scrollbox1) do begin //crea un Tedit
Parent := Form1.Scrollbox1;
Text :='1';
Left := i*30;
top :=t*30;
Width:=27;
Color:=clBlue;
Font.Color:=clWhite;
MaxLength:=3; // limita a números de 3 digitos
OnKeyPress:=Form1.MatPress; //para controlar la entrada
end;
dim:=n;
end;

procedure Borrar_Matriz();
var
i:integer;
begin
for i:=Form1.Scrollbox1.ComponentCount-1 DownTo 0 Do
if Form1.Scrollbox1.Components[i] Is TEdit Then
Form1.Scrollbox1.Components[i].Free;
end;


procedure TForm1.matriz2x21Click(Sender: TObject);
begin
Borrar_Matriz();
Crear_Matriz(2); // dim = 2
end;

procedure TForm1.matriz3x31Click(Sender: TObject);
begin
Borrar_Matriz();
Crear_Matriz(3);
end;

procedure TForm1.matriz4x41Click(Sender: TObject);
begin
Borrar_Matriz();
Crear_Matriz(4);
end;

function isnum(S:string):boolean;
var
c,i:integer;
begin
c:=0;
for i:=1 to length(S) do begin
if ((ord(S[i]) < 48) or (ord(S[i])>57)) then c:=c+1;
end;
if c=0 then isnum:=True else isnum:=False;
end;

procedure TForm1.Matriznxn1Click(Sender: TObject);
var
S:string;
n:integer;
begin
Borrar_Matriz();
repeat
S:=InputBox('¿Cual es la dimensión de la Matriz?','n debe estar comprendido entre 2 y 25','5');
if ((isnum(S)) and (length(S)<7)) then n:=StrToInt(S) else n:=0;
until ((n<=25) and (n>=2));
Crear_Matriz(n);
end;

procedure init_Matriz(var M:mat);
var
i,j:integer;
begin
for i:=1 to 25 do
for j:=1 to 25 do
M[i,j]:=0;
end;


function ExtraerMenor(var M:Mat;Fila,Columna,dim2:integer):mat;
var
i,j,k:integer;
M1:mat;
begin
k:=1;
init_Matriz(M1);
for i:=1 to dim2 do
for j:=1 to dim2 do
if ((i<>Fila) and (j<>Columna)) then begin
if k mod dim2 = 0 then k:=k+1;
M1[(k div (dim2))+1,(k mod (dim2))]:=M[i,j];
k:=k+1;
end;
ExtraerMenor:=M1;
end;

function Determinante(var M:Mat; dimM:integer):Int64;
var
M1: Mat;
i:integer;
temp:int64;
begin
if dimM=2 then
Determinante:=((M[1,1]*M[2,2])-(M[1,2]*M[2,1]))
else begin
temp:=0;
for i:=1 to dimM do begin
if (M[i,1]<>0) then begin
M1:=ExtraerMenor(M,i,1,dimM);
if (i mod 2 =0) then temp:=temp-M[i,1]*Determinante(M1,dimM-1)
else temp:=temp+M[i,1]*Determinante(M1,dimM-1);
end;
end;
Determinante:=temp;
end;
end;

procedure TForm1.CalcularDeterminanteClick(Sender: TObject);
var
i:integer;
begin
if (dim<>0) then begin
init_Matriz(M);
For i:=0 to Form1.Scrollbox1.ComponentCount-1 Do
If Form1.Scrollbox1.Components[i] Is TEdit Then begin
M[(i mod dim)+1,(i div dim)+1]:=StrToInt(Tedit(Form1.Scrollbox1.Components[i]).Text);
end;

MessageBox(Handle,
PChar('El determinante es igual a : '+ IntToStr( Determinante(M,dim))),
PChar('Resultado'),
MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL);
end;

end;



procedure TForm1.FormCreate(Sender: TObject);
begin
dim:=0;
end;


procedure TForm1.MatPress(Sender: TObject; var Key: Char);
begin
if (((Key>#57) or (Key<#48)) and (key<>#45)) then Key:=#0; // sólo permite ingresar números
end;

end.


Saludos