Delphi

  • Автор темы skazochniker
  • Дата начала
S

skazochniker

#1
Парни выручайте! Очень надо.


Класс для представления матриц целых чисел. Размер матрицы произволен. Реализовать операции над матрицами: сложение, умножение матрицы на скаляр, транспонирование, вычисление определителя (в случае, если это воз-можно).


Зарание спасибо)
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Парни выручайте! Очень надо.
Класс для представления матриц целых чисел. Размер матрицы произволен. Реализовать операции над матрицами: сложение, умножение матрицы на скаляр, транспонирование, вычисление определителя (в случае, если это воз-можно).
Зарание спасибо)
Пойди туда не знаю куда?...
Приложение какое пишете? консольное? оконное?
Матрица как заполняется? ручками? генератором случайных чисел?
Выводить результат операций куда?
Операции как реализуются? Функциями в модуле? Или методами класса?
 

sinkopa

Well-known member
17.06.2009
344
4
#3
Парни выручайте! Очень надо.
Так что?... нет пожеланий?
Тогда вот:
Код:
unit uMatrix;
interface
uses
Classes;

type
TMatrixArray = array of array of Integer;
TMatrix = class;

TMatrix = class
private
FData: TMatrixArray;
function Get(Col, Row: Integer): Integer;
function GetColCount: Integer;
function GetRowCount: Integer;
procedure Put(Col, Row: Integer; const Value: Integer);
public
{ конструктор. если Rows = 0, создается квадратичная матрица Cols х Cols }
constructor Create(Cols: Integer; Rows: Integer = 0);
destructor Destroy; override;
{ Очистка (заполнение нолями ) }
procedure Clear;
{ Заполнение случайными значениями в диапазоне от min до max }
procedure RandomFill(min: Integer = 0; max: Integer = 20);
{ Транспонирование. Результат - новая матрица }
function Transpose: TMatrix;
{ Вычисление определителя }
function Determinant: Integer;
{ Минор - остаток матрицы после вычитания строки и столбца}
function Minor(Col,Row: Integer): TMatrix;
{ Сложение с другой матрицей. Результат - новая матрица }
function SummOnMatrix(iMatrix: TMatrix): TMatrix;
{ Умножение матрицы на скаляр. Результат - новая матрица }
function MultipleOnNumber(Number: Integer): TMatrix;
{ "печать" матрицы в строку }
function ToString: string;
property Elements[Col,Row: Integer]: Integer read Get write Put; default;
property ColCount: Integer read GetColCount;
property RowCount: Integer read GetRowCount;
end;

implementation

uses
SysUtils, Math;

{ TMatrix }

procedure TMatrix.Clear;
var
i,j: Integer;
begin
for i := 0 to ColCount-1 do
for j := 0 to RowCount-1 do
FData[i,j] := 0;
end;

constructor TMatrix.Create(Cols: Integer; Rows: Integer);
begin
if (Rows < 1) then
Rows := Cols;
SetLength(FData,Cols,Rows);
Clear;
end;

destructor TMatrix.Destroy;
begin
SetLength(FData,0,0);
inherited;
end;

function TMatrix.Determinant: Integer;
var
i,j : Integer;
tmp : TMatrix;
Sign: Integer;
begin
Result := 0;

if (ColCount <> RowCount) then //матрица не квадратная!
Exit;

if (ColCount = 1) then
Result := Self[0,0]
else
begin
Sign := 1;
for i := 0 to RowCount-1 do
begin
tmp := Self.Minor(0,i);
Result := Result + Sign * tmp.Determinant * Self[0,i];
Sign := - Sign;
tmp.Free;
end;
end;
end;

function TMatrix.Get(Col,Row: Integer): Integer;
begin
if (Col < ColCount) and (Row < RowCount) then
Result := FData[Col,Row]
else
Result := 0;
end;

function TMatrix.GetColCount: Integer;
begin
Result := Length(FData);
end;

function TMatrix.GetRowCount: Integer;
begin
if Length(FData) > 0 then
Result := Length(FData[0])
else
Result := 0;
end;

function TMatrix.Minor(Col, Row: Integer): TMatrix;
var
c, r, idc, idr : Integer;
begin
Result := TMatrix.Create(ColCount-1,RowCount-1);
for c := 0 to ColCount-1 do
for r := 0 to RowCount-1 do
if ( c <> Col) and ( r <> Row) then
begin
idc := c;
idr := r;
if c > Col then
dec(idc);
if r > Row then
dec(idr);
Result[idc,idr] := Self[c,r];
end;
end;

function TMatrix.MultipleOnNumber(Number: Integer): TMatrix;
var
tmp: TMatrix;
i,j: Integer;
begin
Result := TMatrix.Create(ColCount,RowCount);
for i := 0 to ColCount-1 do
for j := 0 to RowCount-1 do
Result[i,j] := Self[i,j] * Number;
end;

procedure TMatrix.Put(Col, Row: Integer; const Value: Integer);
begin
FData[Col,Row] := Value;
end;

procedure TMatrix.RandomFill(min, max: Integer);
var
i,j: Integer;
begin
Randomize;
for i := 0 to ColCount-1 do
for j := 0 to RowCount-1 do
FData[i,j] := RandomRange(min, max);
end;

function TMatrix.SummOnMatrix(iMatrix: TMatrix): TMatrix;
var
i,j: Integer;
begin
Result := TMatrix.Create(Max(ColCount,iMatrix.ColCount), Max(RowCount,iMatrix.RowCount));
for i:= 0 to Result.ColCount-1 do
for j:= 0 to Result.RowCount-1 do
Result[i,j] := Self[i,j] + iMatrix[i,j];
end;

function TMatrix.ToString: string;
var
i,j: Integer;
begin
Result := '';
for i:= 0 to ColCount-1 do
begin
if (i > 0) then
Result := Result + #13#10;
for j:= 0 to RowCount-1 do
begin
if (j > 0) then
Result := Result + #9;
Result := Result + IntToStr(Self[i,j]);
end;
end;
end;

function TMatrix.Transpose: TMatrix;
var
i,j: Integer;
begin
Result := TMatrix.Create(RowCount,ColCount);
for i := 0 to RowCount-1 do
for j := 0 to ColCount-1 do
Result[i,j] := Self[j,i];
end;

end.
использование
Код:
uses
uMatrix;

procedure TForm1.Button1Click(Sender: TObject);
var
m1,m2,m3,m4,m5 : TMatrix;
s: string;
begin
m1 := TMatrix.Create(5);
m2 := TMatrix.Create(5,5);
m1.RandomFill();
m2.RandomFill(-5,15);

s := 'Матрица 1'#13#10  + m1.ToString + #13#10;
s := s+'Матрица 2'#13#10 + m2.ToString + #13#10;

s := s+'Определитель для Матрицы 1 = '+ IntToStr(m1.Determinant) + #13#10;
s := s+'Определитель для Матрицы 2 = '+ IntToStr(m2.Determinant) + #13#10;

m3 := m1.SummOnMatrix(m2);
s := s+'Результат сложения Матриц 1 и 2:'+ #13#10 + m3.ToString + #13#10;

m4 := m1.Transpose;
s := s+'Результат транспонирования Матрицы 1'+ #13#10 + m4.ToString + #13#10;

m5 := m2.MultipleOnNumber(3);
s := s+'Результат умножения Матрицы 2 на 3:'+ #13#10 + m5.ToString + #13#10;

ShowMessage(s);

m5.Free;
m4.Free;
m3.Free;
m2.Free;
m1.Free;
end;
 
S

skazochniker

#4
Очень тебе благодарен,прости что не уточнил, мне надо было в консоле написать,если тебя не затруднит, помоги пожалуйста ещё разок;)
 

sinkopa

Well-known member
17.06.2009
344
4
#5
Очень тебе благодарен,прости что не уточнил, мне надо было в консоле написать,если тебя не затруднит, помоги пожалуйста ещё разок:rolleyes:
Код:
program matrix;

{$APPTYPE CONSOLE}

uses
SysUtils,
Windows,
uMatrix;

function RU(input: string): string;
begin
Result := input;
AnsiToOem(PChar(input),PChar(Result));
end;

var
m1,m2,m3,m4,m5 : TMatrix;
begin
m1 := TMatrix.Create(5);
m2 := TMatrix.Create(5);
m1.RandomFill();
m2.RandomFill(-5,15);

Writeln(RU('** Матрица 1 **'));
Writeln(m1.ToString);

Writeln;
Writeln(RU('** Матрица 2 **'));
Writeln(m2.ToString);

Writeln;
Write(RU('Определитель для Матрицы 1 = '));
Writeln(m1.Determinant);

Write(RU('Определитель для Матрицы 2 = '));
Writeln(m2.Determinant);

m3 := m1.SummOnMatrix(m2);

Writeln;
Writeln(RU('* Результат сложения Матриц 1 и 2:'));
Writeln(m3.ToString);

m4 := m1.Transpose;
Writeln;
Writeln(RU('* Результат транспонирования Матрицы 1'));
Writeln(m4.ToString);

m5 := m2.MultipleOnNumber(3);
Writeln;
Writeln(RU('* Результат умножения Матрицы 2 на число 3:'));
Writeln(m5.ToString);

m5.Free;
m4.Free;
m3.Free;
m2.Free;
m1.Free;
end.
 

Sevas

New member
28.02.2013
1
0
#6
Код:
program matrix;

{$APPTYPE CONSOLE}

uses
SysUtils,
Windows,
uMatrix;

function RU(input: string): string;
begin
Result := input;
AnsiToOem(PChar(input),PChar(Result));
end;

var
m1,m2,m3,m4,m5 : TMatrix;
begin
m1 := TMatrix.Create(5);
m2 := TMatrix.Create(5);
m1.RandomFill();
m2.RandomFill(-5,15);

Writeln(RU('** Матрица 1 **'));
Writeln(m1.ToString);

Writeln;
Writeln(RU('** Матрица 2 **'));
Writeln(m2.ToString);

Writeln;
Write(RU('Определитель для Матрицы 1 = '));
Writeln(m1.Determinant);

Write(RU('Определитель для Матрицы 2 = '));
Writeln(m2.Determinant);

m3 := m1.SummOnMatrix(m2);

Writeln;
Writeln(RU('* Результат сложения Матриц 1 и 2:'));
Writeln(m3.ToString);

m4 := m1.Transpose;
Writeln;
Writeln(RU('* Результат транспонирования Матрицы 1'));
Writeln(m4.ToString);

m5 := m2.MultipleOnNumber(3);
Writeln;
Writeln(RU('* Результат умножения Матрицы 2 на число 3:'));
Writeln(m5.ToString);

m5.Free;
m4.Free;
m3.Free;
m2.Free;
m1.Free;
end.
Матрицы должна вводиться с клавиатуры,указывая кол-во строк и столбцов, все основные действия должны выбираться в пунктах меню.
Скаляр, на который нужно умножать, тоже должен вводиться с клавиатуры. При некорректном вводе, должно выскакивать предупреждения о неправильном вводе данных. Помоги ещё раз, если не затруднит и желательно в сразу в файле.
 

sinkopa

Well-known member
17.06.2009
344
4
#7
Матрицы должна вводиться с клавиатуры,указывая кол-во строк и столбцов, все основные действия должны выбираться в пунктах меню.
Ну ну... может еще и с преподом Вашим договориться о приеме-сдаче задания? :rolleyes:
Код:
var
m1 : TMatrix;
cols,rows: Integer;
n: Integer;
begin
Writeln(RU('Укажите размер матрицы: '));
Write(RU('Кол-во колонок = '));
Readln(cols);
Write(RU('Кол-во строк  = '));
Readln(rows);
m1 := TMatrix.Create(cols,rows);

Writeln(RU('Заполните матрицу значениями: '));
for cols := 0 to m1.ColCount - 1 do
for rows := 0 to m1.RowCount - 1 do
begin
Write('[',cols,',',rows,'] = ');
Readln(n);
m1[cols,rows] := n;
end;

Writeln(RU('** Матрица 1 **'));
Writeln(m1.ToString);
//...
Дальше сами...