Advertisement
MadCortez

Untitled

Mar 17th, 2021
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 12.48 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.     Label1: TLabel;
  17.     Edit1: TEdit;
  18.     OpenDialog1: TOpenDialog;
  19.     SaveDialog1: TSaveDialog;
  20.     Arr: TStringGrid;
  21.     Button1: TButton;
  22.     FindMatrix: TButton;
  23.     Edit2: TEdit;
  24.     Label2: TLabel;
  25.     Label3: TLabel;
  26.     procedure N2Click(Sender: TObject);
  27.     procedure OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  28.     procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  29.     procedure Button1Click(Sender: TObject);
  30.     procedure Edit1Change(Sender: TObject);
  31.     procedure Edit1KeyPress(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'];
  74. begin
  75.    with (Sender as TStringGrid) do
  76.    begin
  77.       if not(Key in Digit) then
  78.          Key := #0;
  79.    end;
  80. end;
  81.  
  82. procedure TForm1.Button1Click(Sender: TObject);
  83. var
  84.    ErrMsg: String;
  85.    Err, i, j: Integer;
  86. begin
  87.    ErrMsg := 'Кол-во вершин должно лежать в промежутке ' + IntToStr(MIN_SIZE) + '..' + IntToStr(MAX_SIZE);
  88.    val(Edit1.Text, SizeM, Err);
  89.    val(Edit2.Text, SizeN, Err);
  90.    if (SizeN < MIN_Size) or (SizeN > MAX_Size) or (SizeM < MIN_Size) or (SizeM > MAX_Size)then
  91.       MessageDlg(ErrMsg, mtError, [mbOK], 0)
  92.    else
  93.    begin
  94.       Arr.ColCount := SizeN;
  95.       if SizeM = 2 then
  96.       begin
  97.       Arr.DefaultColWidth := 50;
  98.       Arr.Width := (Arr.DefaultColWidth + 6) * (SizeN);
  99.       Arr.RowCount := SizeM;
  100.       Arr.DefaultRowHeight := 20;
  101.       Arr.Height := (Arr.DefaultRowHeight + 6) * SizeM;
  102.       end
  103.       else
  104.       begin
  105.       Arr.DefaultColWidth := 50;
  106.       Arr.Width := (Arr.DefaultColWidth + 2) * (SizeN);
  107.       Arr.RowCount := SizeM;
  108.       Arr.DefaultRowHeight := 20;
  109.       Arr.Height := (Arr.DefaultRowHeight + 2) * SizeM;
  110.       end;
  111.       for i := 0 to SizeM do
  112.          for j := 0 to SizeN do
  113.             Arr.Rows[j].Objects[i] := TObject(RGB(255, 255, 255));
  114.       Arr.Repaint;
  115.       Arr.Visible := True;
  116.       FindMatrix.Visible := True;
  117.    end;
  118. end;
  119.  
  120. procedure TForm1.FindMatrixClick(Sender: TObject);
  121. var
  122.    i, j, k, Shir, Dlin, c, MaxId, MinShir: Integer;
  123.    Matrix: array of array of Byte;
  124.    a: array of Byte;
  125.    x1, x2, y1, y2: array of Byte;
  126. begin
  127.    SetLength(Matrix, SizeM, SizeN);
  128.    for i := 0 to (SizeM - 1) do
  129.       for j := 0 to SizeN - 1 do
  130.          Matrix[i][j] := StrToInt(Arr.Cells[j, i]);
  131.  
  132.    SizeN := SizeN xor SizeM;
  133.    SizeM := SizeN xor SizeM;
  134.    SizeN := SizeN xor SizeM;
  135.  
  136.    for i := 0 to SizeN - 1 do
  137.       for j := 0 to SizeM - 1 do
  138.          if Matrix[i][j] = 1 then
  139.          begin
  140.             Dlin := 0;
  141.             MinShir := 0;
  142.             c := i;
  143.             k := j;
  144.             while Matrix[c][k] = 1 do
  145.             begin
  146.                Shir := 0;
  147.                while Matrix[c][k] = 1 do
  148.                begin
  149.                   Inc(k);
  150.                   inc(Shir);
  151.                   if MinShir <> 0 then
  152.                      if Shir > MinShir then
  153.                      begin
  154.                         Dec(Shir);
  155.                         break;
  156.                      end;
  157.                   if k = SizeM then
  158.                   begin
  159.                      Dec(k);
  160.                      break;
  161.                   end;
  162.                end;
  163.                if (MinShir > Shir) or (MinShir = 0) then
  164.                   MinShir := Shir;
  165.                Inc(Dlin);
  166.                SetLength(a, Length(a) + 1);
  167.                SetLength(x1, Length(x1) + 1);
  168.                SetLength(x2, Length(x2) + 1);
  169.                SetLength(y1, Length(y1) + 1);
  170.                SetLength(y2, Length(y2) + 1);
  171.                a[High(a)] := Dlin * MinShir;
  172.                x1[High(x1)] := i;
  173.                x2[High(x2)] := c;
  174.                y1[High(a)] := j;
  175.                y2[High(a)] := y1[High(a)] + MinShir - 1;
  176.  
  177.                k := j;
  178.                Inc(c);
  179.                if c = SizeN then
  180.                begin
  181.                   Dec(c);
  182.                   break;
  183.                end;
  184.             end;
  185.          end;
  186.    MaxId := 0;
  187.    for i := 0 to High(a) do
  188.       if a[i] > a[MaxId] then
  189.          MaxId := i;
  190.    for i := x1[MaxId] to x2[MaxId] do
  191.       for j := y1[MaxId] to y2[MaxId] do
  192.          Arr.Rows[j].Objects[i] := TObject(RGB(197, 244, 178));
  193.    Arr.Repaint;
  194. end;
  195.  
  196. procedure TForm1.Edit1Change(Sender: TObject);
  197. var
  198.    IsValid1, IsValid2: Boolean;
  199.    i: Integer;
  200. begin
  201.    Arr.Visible := False;
  202.    FindMatrix.Visible := False;
  203.    with Arr do
  204.       for i := 0 to SizeN do
  205.          Cols[i].Clear;
  206.    if Edit1.Text <> '' then
  207.       IsValid1 := True;
  208.    if Edit2.Text <> '' then
  209.       IsValid2 := True;
  210.    if (IsValid1) and (IsValid2) then
  211.       Button1.Enabled := True
  212.    else
  213.       Button1.Enabled := False;
  214. end;
  215.  
  216. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  217. const
  218.    Digit: set of Char = ['1'..'9', '0', #8];
  219. begin
  220.    with (Sender as TEdit) do
  221.    begin
  222.       if not(Key in Digit) then
  223.          Key := #0;
  224.    end;
  225. end;
  226.  
  227. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  228. begin
  229.    CanClose := MessageDlg('Вы уверены, что хотите выйти из программы?' +
  230.       #10#13 + 'Все несохраненные данные будут утеряны.',
  231.       mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  232. end;
  233.  
  234. procedure TForm1.N2Click(Sender: TObject);
  235. var
  236.    Task: String;
  237. begin
  238.    Task := 'Данная программа находит максимальную подматрицу из единиц' + #10#13;
  239.    Task := Task + 'Автор - Пестунов Илья, гр. 051007';
  240.    MessageDlg(Task, mtInformation, [mbOK], 0);
  241. end;
  242.  
  243. procedure TForm1.N3Click(Sender: TObject);
  244. var
  245.    MyFile: TextFile;
  246.    i, Value, j: Integer;
  247. begin
  248.    Edit1.Text := '';
  249.    Edit2.Text := '';
  250.    Arr.Visible := False;
  251.    with Arr do
  252.       for i := 0 to SizeN do
  253.          Cols[i].Clear;
  254.    if OpenDialog1.Execute then
  255.    begin
  256.       AssignFile(MyFile, OpenDialog1.FileName);
  257.       Reset(MyFile);
  258.       Read(MyFile, SizeM);
  259.       Read(MyFile, SizeN);
  260.       Edit1.Text := IntToStr(SizeM);
  261.       Edit2.Text := IntToStr(SizeN);
  262.       Arr.ColCount := SizeN;
  263.       if SizeM = 2 then
  264.       begin
  265.       Arr.DefaultColWidth := 50;
  266.       Arr.Width := (Arr.DefaultColWidth + 6) * (SizeN);
  267.       Arr.RowCount := SizeM;
  268.       Arr.DefaultRowHeight := 20;
  269.       Arr.Height := (Arr.DefaultRowHeight + 6) * SizeM;
  270.       end
  271.       else
  272.       begin
  273.       Arr.DefaultColWidth := 50;
  274.       Arr.Width := (Arr.DefaultColWidth + 2) * (SizeN);
  275.       Arr.RowCount := SizeM;
  276.       Arr.DefaultRowHeight := 20;
  277.       Arr.Height := (Arr.DefaultRowHeight + 2) * SizeM;
  278.       end;
  279.       for i := 0 to (SizeM - 1) do
  280.          for j := 0 to SizeN - 1 do
  281.          begin
  282.             Read(MyFile, Value);
  283.             Arr.Cells[j, i] := IntToStr(Value);
  284.          end;
  285.       CloseFile(MyFile);
  286.       for i := 0 to SizeM do
  287.          for j := 0 to SizeN do
  288.             Arr.Rows[j].Objects[i] := TObject(RGB(255, 255, 255));
  289.       Arr.Repaint;
  290.       Arr.Visible := True;
  291.       FindMatrix.Visible := True;
  292.    end;
  293. end;
  294.  
  295. procedure TForm1.N4Click(Sender: TObject);
  296. var
  297.    MyFile: TextFile;
  298.    i, j: Integer;
  299. begin
  300.    if SaveDialog1.Execute then
  301.    begin
  302.       AssignFile(MyFile, SaveDialog1.FileName);
  303.       Rewrite(MyFile);
  304.       for i := 0 to (SizeN - 1) do
  305.       begin
  306.          for j := 0 to (SizeN - 1) do
  307.             Write(MyFile, Arr.Cells[j, i], ' ');
  308.          Writeln(MyFile);
  309.       end;
  310.       CloseFile(MyFile);
  311.       MessageDlg('Результат успешно сохранён', mtCustom, [mbOK], 0);
  312.    end;
  313. end;
  314.  
  315. procedure TForm1.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  316. var
  317.    IsValid: Boolean;
  318.    N, i, Value, Err, j: Integer;
  319.    MyFile: TextFile;
  320.    Check: String;
  321. const
  322.    Digit: set of Char = ['1', '0', ' '];
  323. begin
  324.    IsValid := True;
  325.    N := Length(OpenDialog1.FileName);
  326.    if (OpenDialog1.FileName[N] = 't') and (OpenDialog1.FileName[N - 1] = 'x') and (OpenDialog1.FileName[N - 2] = 't') then
  327.    begin
  328.       AssignFile(MyFile, OpenDialog1.FileName);
  329.       Reset(MyFile);
  330.       Read(MyFile, Check);
  331.       CloseFile(MyFile);
  332.       if Length(Check) = 0 then
  333.       begin
  334.          MessageDlg('Файл пуст', mtWarning, [mbOK], 0);
  335.          IsValid := False;
  336.       end
  337.       else
  338.       begin
  339.          AssignFile(MyFile, OpenDialog1.FileName);
  340.          Reset(MyFile);
  341.          try
  342.             Read(MyFile, SizeN);
  343.          except
  344.             IsValid := False;
  345.             MessageDlg('Порядок матрицы должен быть натуральным числом до 8', mtWarning, [mbOK], 0);
  346.          end;
  347.          if ((IsValid) and (SizeN < MIN_SIZE)) or ((IsValid) and (SizeN > MAX_SIZE)) then
  348.          begin
  349.             IsValid := False;
  350.             MessageDlg('Порядок матрицы должна быть натуральным числом до 8', mtError, [mbOK], 0);
  351.          end;
  352.          try
  353.             Readln(MyFile, SizeM);
  354.          except
  355.             IsValid := False;
  356.             MessageDlg('Порядок матрицы должен быть натуральным числом до 8', mtWarning, [mbOK], 0);
  357.          end;
  358.          if ((IsValid) and (SizeM < MIN_SIZE)) or ((IsValid) and (SizeM > MAX_SIZE)) then
  359.          begin
  360.             IsValid := False;
  361.             MessageDlg('Порядок матрицы должна быть натуральным числом до 8', mtError, [mbOK], 0);
  362.          end;
  363.          if IsValid then
  364.          begin
  365.             for j := 1 to SizeN do
  366.             begin
  367.                Readln(MyFile, Check);
  368.                i := 1;
  369.                while (IsValid) and (i <= Length(Check)) do
  370.                begin
  371.                   if not(Check[i] in Digit) then
  372.                   begin
  373.                      IsValid := False;
  374.                      MessageDlg('Элементами матрицы должны быть числа 0 или 1', mtWarning, [mbOK], 0);
  375.                   end;
  376.                   Inc(i);
  377.                end;
  378.             end;
  379.             Readln(MyFile, Check);
  380.                i := 1;
  381.                while (IsValid) and (i <= Length(Check)) do
  382.                begin
  383.                   if not(Check[i] in Digit) then
  384.                   begin
  385.                      IsValid := False;
  386.                      MessageDlg('Элементами матрицы должны быть числа 0 или 1', mtWarning, [mbOK], 0);
  387.                   end;
  388.                   Inc(i);
  389.                end;
  390.          end;
  391.          CloseFile(MyFile);
  392.       end;
  393.    end
  394.    else
  395.    begin
  396.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  397.       IsValid := False;
  398.    end;
  399.    if not(IsValid) then
  400.       CanClose := False;
  401. end;
  402.  
  403. procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  404. var
  405.    N: Integer;
  406. begin
  407.    N := Length(SaveDialog1.FileName);
  408.    if (SaveDialog1.FileName[N] = 't') and (SaveDialog1.FileName[N - 1] = 'x') and (SaveDialog1.FileName[N - 2] = 't') then
  409.       CanClose := True
  410.    else
  411.    begin
  412.       CanClose := False;
  413.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  414.    end;
  415. end;
  416.  
  417. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement