Advertisement
MadCortez

Untitled

Mar 23rd, 2021
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 13.77 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.Grids;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     N1: TMenuItem;
  13.     N2: TMenuItem;
  14.     N3: TMenuItem;
  15.     N4: TMenuItem;
  16.     Size: TLabel;
  17.     MCol: TEdit;
  18.     OpenDialog1: TOpenDialog;
  19.     SaveDialog1: TSaveDialog;
  20.     Arr: TStringGrid;
  21.     SetSize: TButton;
  22.     FindMatrix: TButton;
  23.     NCol: TEdit;
  24.     LMCol: TLabel;
  25.     LNCol: TLabel;
  26.     procedure N2Click(Sender: TObject);
  27.     procedure OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  28.     procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  29.     procedure SetSizeClick(Sender: TObject);
  30.     procedure MColChange(Sender: TObject);
  31.     procedure MColKeyPress(Sender: TObject; var Key: Char);
  32.     procedure FindMatrixClick(Sender: TObject);
  33.     procedure N3Click(Sender: TObject);
  34.     procedure N4Click(Sender: TObject);
  35.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  36.     procedure ArrKeyPress(Sender: TObject; var Key: Char);
  37.     procedure ArrDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  38.       State: TGridDrawState);
  39.   private
  40.     { Private declarations }
  41.   public
  42.     { Public declarations }
  43.   end;
  44.  
  45. var
  46.   Form1: TForm1;
  47.   SizeN, SizeM: Integer;
  48.   IsValid: Boolean;
  49. const
  50.    MIN_SIZE = 2;
  51.    MAX_SIZE = 8;
  52.  
  53. implementation
  54.  
  55. {$R *.dfm}
  56.  
  57. procedure TForm1.ArrDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  58.   State: TGridDrawState);
  59. var
  60.    CellColor : TColor;
  61. begin
  62.   with Arr.Canvas do
  63.    begin
  64.       CellColor := TColor(Arr.Rows[ACol].Objects[ARow]);
  65.       Brush.Color := CellColor;
  66.       FillRect(Rect);
  67.       TextOut(Rect.Left + 3, Rect.Top + 2, Arr.Cells[ACol, ARow]);
  68.    end;
  69. end;
  70.  
  71. procedure TForm1.ArrKeyPress(Sender: TObject; var Key: Char);
  72. const
  73.    Digit: set of Char = ['0', '1', #8];
  74. var
  75.    i, j, k: Integer;
  76.    Flag: Boolean;
  77. begin
  78.    with (Sender as TStringGrid) do
  79.    begin
  80.       k := 1;
  81.       if not(Key in Digit) then
  82.          Key := #0;
  83.       for i := 0 to Arr.RowCount - 1 do
  84.          for j := 0 to Arr.ColCount - 1 do
  85.             if Length(Arr.Cells[j, i]) = 1 then
  86.             begin
  87.                Arr.Cells[j, i] := Arr.Cells[j, i][1];
  88.                Inc(k);
  89.             end;
  90.       for i := 0 to SizeM do
  91.          for j := 0 to SizeN do
  92.             Arr.Rows[j].Objects[i] := TObject(RGB(255, 255, 255));
  93.       if (k = (SizeN) * (SizeM)) or (k - 1 = (SizeN) * (SizeM))  then
  94.          Flag := True
  95.       else
  96.          Flag := False;
  97.    if Key = #8 then
  98.          Flag := False;
  99.    FindMatrix.Enabled := Flag;
  100.    N4.Enabled := False;
  101.    end;
  102. end;
  103.  
  104. procedure TForm1.SetSizeClick(Sender: TObject);
  105. var
  106.    ErrMsg: String;
  107.    Err, i, j: Integer;
  108. begin
  109.    ErrMsg := 'Кол-во вершин должно лежать в промежутке ' + IntToStr(MIN_SIZE) + '..' + IntToStr(MAX_SIZE);
  110.    val(MCol.Text, SizeM, Err);
  111.    val(NCol.Text, SizeN, Err);
  112.    if (SizeN < MIN_Size) or (SizeN > MAX_Size) or (SizeM < MIN_Size) or (SizeM > MAX_Size)then
  113.       MessageDlg(ErrMsg, mtError, [mbOK], 0)
  114.    else
  115.    begin
  116.       Arr.ColCount := SizeN;
  117.       if (SizeM = 2) or (SizeN = 2) then
  118.       begin
  119.          Arr.DefaultColWidth := 50;
  120.          Arr.Width := (Arr.DefaultColWidth + 6) * (SizeN);
  121.          Arr.RowCount := SizeM;
  122.          Arr.DefaultRowHeight := 20;
  123.          Arr.Height := (Arr.DefaultRowHeight + 6) * SizeM;
  124.       end
  125.       else
  126.       begin
  127.          Arr.DefaultColWidth := 50;
  128.          Arr.Width := (Arr.DefaultColWidth + 2) * (SizeN);
  129.          Arr.RowCount := SizeM;
  130.          Arr.DefaultRowHeight := 20;
  131.          Arr.Height := (Arr.DefaultRowHeight + 2) * SizeM;
  132.       end;
  133.       for i := 0 to SizeM do
  134.          for j := 0 to SizeN do
  135.             Arr.Rows[j].Objects[i] := TObject(RGB(255, 255, 255));
  136.       Arr.Repaint;
  137.       Arr.Visible := True;
  138.       FindMatrix.Visible := True;
  139.       FindMatrix.Enabled := False;
  140.    end;
  141. end;
  142.  
  143. procedure TForm1.FindMatrixClick(Sender: TObject);
  144. var
  145.    i, j, k, Shir, Dlin, c, MaxId, MinShir: Integer;
  146.    Matrix: array of array of Byte;
  147.    a: array of Byte;
  148.    x1, x2, y1, y2: array of Byte;
  149. begin
  150.    for i := 0 to SizeM do
  151.          for j := 0 to SizeN do
  152.             Arr.Rows[j].Objects[i] := TObject(RGB(255, 255, 255));
  153.    SetLength(Matrix, SizeM, SizeN);
  154.    for i := 0 to (SizeM - 1) do
  155.       for j := 0 to SizeN - 1 do
  156.          Matrix[i][j] := StrToInt(Arr.Cells[j, i]);
  157.  
  158.    SizeN := SizeN xor SizeM;
  159.    SizeM := SizeN xor SizeM;
  160.    SizeN := SizeN xor SizeM;
  161.  
  162.    for i := 0 to SizeN - 1 do
  163.       for j := 0 to SizeM - 1 do
  164.          if Matrix[i][j] = 1 then
  165.          begin
  166.             Dlin := 0;
  167.             MinShir := 0;
  168.             c := i;
  169.             k := j;
  170.             while Matrix[c][k] = 1 do
  171.             begin
  172.                Shir := 0;
  173.                while Matrix[c][k] = 1 do
  174.                begin
  175.                   Inc(k);
  176.                   inc(Shir);
  177.                   if MinShir <> 0 then
  178.                      if Shir > MinShir then
  179.                      begin
  180.                         Dec(Shir);
  181.                         break;
  182.                      end;
  183.                   if k = SizeM then
  184.                   begin
  185.                      Dec(k);
  186.                      break;
  187.                   end;
  188.                end;
  189.                if (MinShir > Shir) or (MinShir = 0) then
  190.                   MinShir := Shir;
  191.                Inc(Dlin);
  192.                SetLength(a, Length(a) + 1);
  193.                SetLength(x1, Length(x1) + 1);
  194.                SetLength(x2, Length(x2) + 1);
  195.                SetLength(y1, Length(y1) + 1);
  196.                SetLength(y2, Length(y2) + 1);
  197.                a[High(a)] := Dlin * MinShir;
  198.                x1[High(x1)] := i;
  199.                x2[High(x2)] := c;
  200.                y1[High(a)] := j;
  201.                y2[High(a)] := y1[High(a)] + MinShir - 1;
  202.  
  203.                k := j;
  204.                Inc(c);
  205.                if c = SizeN then
  206.                begin
  207.                   Dec(c);
  208.                   break;
  209.                end;
  210.             end;
  211.          end;
  212.    MaxId := 0;
  213.    for i := 0 to High(a) do
  214.       if a[i] > a[MaxId] then
  215.          MaxId := i;
  216.    for i := x1[MaxId] to x2[MaxId] do
  217.       for j := y1[MaxId] to y2[MaxId] do
  218.          Arr.Rows[j].Objects[i] := TObject(RGB(197, 244, 178));
  219.    Arr.Repaint;
  220.    N4.Enabled := True;
  221.    FindMatrix.Enabled := False;
  222. end;
  223.  
  224. procedure TForm1.MColChange(Sender: TObject);
  225. var
  226.    IsValid1, IsValid2: Boolean;
  227.    i: Integer;
  228. begin
  229.    Arr.Visible := False;
  230.    FindMatrix.Visible := False;
  231.    with Arr do
  232.       for i := 0 to SizeN do
  233.          Cols[i].Clear;
  234.    if MCol.Text <> '' then
  235.       IsValid1 := True;
  236.    if NCol.Text <> '' then
  237.       IsValid2 := True;
  238.    if (IsValid1) and (IsValid2) then
  239.       SetSize.Enabled := True
  240.    else
  241.       SetSize.Enabled := False;
  242. end;
  243.  
  244. procedure TForm1.MColKeyPress(Sender: TObject; var Key: Char);
  245. const
  246.    Digit: set of Char = ['1'..'9', '0', #8];
  247. begin
  248.    with (Sender as TEdit) do
  249.    begin
  250.       if not(Key in Digit) then
  251.          Key := #0;
  252.    end;
  253. end;
  254.  
  255. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  256. begin
  257.    CanClose := MessageDlg('Вы уверены, что хотите выйти из программы?' +
  258.       #10#13 + 'Все несохраненные данные будут утеряны.',
  259.       mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  260. end;
  261.  
  262. procedure TForm1.N2Click(Sender: TObject);
  263. var
  264.    Task: String;
  265. begin
  266.    Task := 'Данная программа находит максимальную подматрицу из единиц' + #10#13;
  267.    Task := Task + 'Автор - Пестунов Илья, гр. 051007';
  268.    MessageDlg(Task, mtInformation, [mbOK], 0);
  269. end;
  270.  
  271. procedure TForm1.N3Click(Sender: TObject);
  272. var
  273.    MyFile: TextFile;
  274.    i, Value, j: Integer;
  275.    s: String;
  276. begin
  277.    MCol.Text := '';
  278.    NCol.Text := '';
  279.    Arr.Visible := False;
  280.    with Arr do
  281.       for i := 0 to SizeN do
  282.          Cols[i].Clear;
  283.    if OpenDialog1.Execute then
  284.    begin
  285.       AssignFile(MyFile, OpenDialog1.FileName);
  286.       Reset(MyFile);
  287.       Read(MyFile, SizeM);
  288.       Read(MyFile, SizeN);
  289.       MCol.Text := IntToStr(SizeM);
  290.       NCol.Text := IntToStr(SizeN);
  291.       Arr.ColCount := SizeN;
  292.       if (SizeM = 2) or (SizeN = 2) then
  293.       begin
  294.          Arr.DefaultColWidth := 50;
  295.          Arr.Width := (Arr.DefaultColWidth + 6) * (SizeN);
  296.          Arr.RowCount := SizeM;
  297.          Arr.DefaultRowHeight := 20;
  298.          Arr.Height := (Arr.DefaultRowHeight + 6) * SizeM;
  299.       end
  300.       else
  301.       begin
  302.          Arr.DefaultColWidth := 50;
  303.          Arr.Width := (Arr.DefaultColWidth + 2) * (SizeN);
  304.          Arr.RowCount := SizeM;
  305.          Arr.DefaultRowHeight := 20;
  306.          Arr.Height := (Arr.DefaultRowHeight + 2) * SizeM;
  307.       end;
  308.       for i := 0 to (SizeM - 1) do
  309.          for j := 0 to SizeN - 1 do
  310.          begin
  311.             Read(MyFile, Value);
  312.             str(Value, s);
  313.             Arr.Cells[j, i] := s[1];
  314.          end;
  315.       CloseFile(MyFile);
  316.       for i := 0 to SizeM do
  317.          for j := 0 to SizeN do
  318.             Arr.Rows[j].Objects[i] := TObject(RGB(255, 255, 255));
  319.       Arr.Repaint;
  320.       Arr.Visible := True;
  321.       FindMatrix.Visible := True;
  322.       FindMatrix.Click;
  323.       //FindMatrix.Enabled := True;
  324.    end;
  325. end;
  326.  
  327. procedure TForm1.N4Click(Sender: TObject);
  328. var
  329.    MyFile: TextFile;
  330.    i, j: Integer;
  331. begin
  332.    if SaveDialog1.Execute then
  333.    begin
  334.       AssignFile(MyFile, SaveDialog1.FileName);
  335.       Rewrite(MyFile);
  336.       Writeln(MyFile, 'Подматрица из 1 - найденная мамксимальная подматрица');
  337.       for i := 0 to (SizeN - 1) do
  338.       begin
  339.          for j := 0 to (SizeM - 1) do
  340.             if Arr.Rows[j].Objects[i] = TObject(RGB(197, 244, 178)) then
  341.                Write(MyFile, Arr.Cells[j, i], ' ')
  342.             else
  343.                Write(MyFIle, '0 ');
  344.          Writeln(MyFile);
  345.       end;
  346.       CloseFile(MyFile);
  347.       MessageDlg('Результат успешно сохранён', mtCustom, [mbOK], 0);
  348.    end;
  349. end;
  350.  
  351. procedure TForm1.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  352. var
  353.    IsValid: Boolean;
  354.    N, i, Value, Err, j: Integer;
  355.    MyFile: TextFile;
  356.    Check: String;
  357. const
  358.    Digit: set of Char = ['1', '0', ' '];
  359. begin
  360.    IsValid := True;
  361.    N := Length(OpenDialog1.FileName);
  362.    if (OpenDialog1.FileName[N] = 't') and (OpenDialog1.FileName[N - 1] = 'x') and (OpenDialog1.FileName[N - 2] = 't') then
  363.    begin
  364.       AssignFile(MyFile, OpenDialog1.FileName);
  365.       Reset(MyFile);
  366.       Read(MyFile, Check);
  367.       CloseFile(MyFile);
  368.       if Length(Check) = 0 then
  369.       begin
  370.          MessageDlg('Файл пуст', mtWarning, [mbOK], 0);
  371.          IsValid := False;
  372.       end
  373.       else
  374.       begin
  375.          AssignFile(MyFile, OpenDialog1.FileName);
  376.          Reset(MyFile);
  377.          try
  378.             Read(MyFile, SizeN);
  379.          except
  380.             IsValid := False;
  381.             MessageDlg('Порядок матрицы должен быть натуральным числом до 8', mtWarning, [mbOK], 0);
  382.          end;
  383.          if ((IsValid) and (SizeN < MIN_SIZE)) or ((IsValid) and (SizeN > MAX_SIZE)) then
  384.          begin
  385.             IsValid := False;
  386.             MessageDlg('Порядок матрицы должна быть натуральным числом до 8', mtError, [mbOK], 0);
  387.          end;
  388.          try
  389.             Readln(MyFile, SizeM);
  390.          except
  391.             IsValid := False;
  392.             MessageDlg('Порядок матрицы должен быть натуральным числом до 8', mtWarning, [mbOK], 0);
  393.          end;
  394.          if ((IsValid) and (SizeM < MIN_SIZE)) or ((IsValid) and (SizeM > MAX_SIZE)) then
  395.          begin
  396.             IsValid := False;
  397.             MessageDlg('Порядок матрицы должна быть натуральным числом до 8', mtError, [mbOK], 0);
  398.          end;
  399.          if IsValid then
  400.          begin
  401.             for j := 1 to SizeN do
  402.             begin
  403.                Readln(MyFile, Check);
  404.                i := 1;
  405.                while (IsValid) and (i <= Length(Check)) do
  406.                begin
  407.                   if not(Check[i] in Digit) then
  408.                   begin
  409.                      IsValid := False;
  410.                      MessageDlg('Элементами матрицы должны быть числа 0 или 1', mtWarning, [mbOK], 0);
  411.                   end;
  412.                   Inc(i);
  413.                end;
  414.             end;
  415.             Readln(MyFile, Check);
  416.                i := 1;
  417.                while (IsValid) and (i <= Length(Check)) do
  418.                begin
  419.                   if not(Check[i] in Digit) then
  420.                   begin
  421.                      IsValid := False;
  422.                      MessageDlg('Элементами матрицы должны быть числа 0 или 1', mtWarning, [mbOK], 0);
  423.                   end;
  424.                   Inc(i);
  425.                end;
  426.          end;
  427.          CloseFile(MyFile);
  428.       end;
  429.    end
  430.    else
  431.    begin
  432.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  433.       IsValid := False;
  434.    end;
  435.    if not(IsValid) then
  436.       CanClose := False;
  437. end;
  438.  
  439. procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  440. var
  441.    N: Integer;
  442. begin
  443.    N := Length(SaveDialog1.FileName);
  444.    if (SaveDialog1.FileName[N] = 't') and (SaveDialog1.FileName[N - 1] = 'x') and (SaveDialog1.FileName[N - 2] = 't') then
  445.       CanClose := True
  446.    else
  447.    begin
  448.       CanClose := False;
  449.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  450.    end;
  451. end;
  452.  
  453. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement