ВОПРОС · Q&A

Delphi

6 ответов 4,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор вопроса
Парни выручайте! Очень надо.


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


Зарание спасибо)
 
Парни выручайте! Очень надо.
Класс для представления матриц целых чисел. Размер матрицы произволен. Реализовать операции над матрицами: сложение, умножение матрицы на скаляр, транспонирование, вычисление определителя (в случае, если это воз-можно).
Зарание спасибо)
Пойди туда не знаю куда?...
Приложение какое пишете? консольное? оконное?
Матрица как заполняется? ручками? генератором случайных чисел?
Выводить результат операций куда?
Операции как реализуются? Функциями в модуле? Или методами класса?
 
Парни выручайте! Очень надо.
Так что?... нет пожеланий?
Тогда вот:
Код:
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;
 
Очень тебе благодарен,прости что не уточнил, мне надо было в консоле написать,если тебя не затруднит, помоги пожалуйста ещё разок;)
 
Очень тебе благодарен,прости что не уточнил, мне надо было в консоле написать,если тебя не затруднит, помоги пожалуйста ещё разок: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.
 
Код:
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.

Матрицы должна вводиться с клавиатуры,указывая кол-во строк и столбцов, все основные действия должны выбираться в пунктах меню.
Скаляр, на который нужно умножать, тоже должен вводиться с клавиатуры. При некорректном вводе, должно выскакивать предупреждения о неправильном вводе данных. Помоги ещё раз, если не затруднит и желательно в сразу в файле.
 
Матрицы должна вводиться с клавиатуры,указывая кол-во строк и столбцов, все основные действия должны выбираться в пунктах меню.
Ну ну... может еще и с преподом Вашим договориться о приеме-сдаче задания? :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);
//...
Дальше сами...