Delphi

Тема в разделе "Pascal and Delphi", создана пользователем skazochniker, 21 фев 2013.

  1. skazochniker

    skazochniker New Member

    Регистрация:
    21 фев 2013
    Сообщения:
    2
    Симпатии:
    0
    Парни выручайте! Очень надо.


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


    Зарание спасибо)
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Пойди туда не знаю куда?...
    Приложение какое пишете? консольное? оконное?
    Матрица как заполняется? ручками? генератором случайных чисел?
    Выводить результат операций куда?
    Операции как реализуются? Функциями в модуле? Или методами класса?
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Так что?... нет пожеланий?
    Тогда вот:
    Код (Delphi):
    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.
    использование
    Код (Delphi):
    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;
     
  4. skazochniker

    skazochniker New Member

    Регистрация:
    21 фев 2013
    Сообщения:
    2
    Симпатии:
    0
    Очень тебе благодарен,прости что не уточнил, мне надо было в консоле написать,если тебя не затруднит, помоги пожалуйста ещё разок;)
     
  5. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Код (Delphi):
    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.
     
  6. Sevas

    Sevas New Member

    Регистрация:
    28 фев 2013
    Сообщения:
    1
    Симпатии:
    0
    Матрицы должна вводиться с клавиатуры,указывая кол-во строк и столбцов, все основные действия должны выбираться в пунктах меню.
    Скаляр, на который нужно умножать, тоже должен вводиться с клавиатуры. При некорректном вводе, должно выскакивать предупреждения о неправильном вводе данных. Помоги ещё раз, если не затруднит и желательно в сразу в файле.
     
  7. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну ну... может еще и с преподом Вашим договориться о приеме-сдаче задания? :rolleyes:
    Код (Delphi):
    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);
    //...
    Дальше сами...
     
Загрузка...

Поделиться этой страницей