Advertisement
MadCortez

Untitled

Mar 23rd, 2021
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 13.57 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', #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.Button1Click(Sender: TObject);
  105. var
  106.    ErrMsg: String;
  107.    Err, i, j: Integer;
  108. begin
  109.    ErrMsg := 'Кол-во вершин должно лежать в промежутке ' + IntToStr(MIN_SIZE) + '..' + IntToStr(MAX_SIZE);
  110.    val(Edit1.Text, SizeM, Err);
  111.    val(Edit2.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.Edit1Change(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 Edit1.Text <> '' then
  235.       IsValid1 := True;
  236.    if Edit2.Text <> '' then
  237.       IsValid2 := True;
  238.    if (IsValid1) and (IsValid2) then
  239.       Button1.Enabled := True
  240.    else
  241.       Button1.Enabled := False;
  242. end;
  243.  
  244. procedure TForm1.Edit1KeyPress(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.    Edit1.Text := '';
  278.    Edit2.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.       Edit1.Text := IntToStr(SizeM);
  290.       Edit2.Text := IntToStr(SizeN);
  291.       Arr.ColCount := SizeN;
  292.       if SizeM = 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.Enabled := True;
  323.    end;
  324. end;
  325.  
  326. procedure TForm1.N4Click(Sender: TObject);
  327. var
  328.    MyFile: TextFile;
  329.    i, j: Integer;
  330. begin
  331.    if SaveDialog1.Execute then
  332.    begin
  333.       AssignFile(MyFile, SaveDialog1.FileName);
  334.       Rewrite(MyFile);
  335.       for i := 0 to (SizeN - 1) do
  336.       begin
  337.          for j := 0 to (SizeN - 1) do
  338.             if Arr.Rows[j].Objects[i] = TObject(RGB(197, 244, 178)) then
  339.                Write(MyFile, Arr.Cells[j, i], ' ')
  340.             else
  341.                Write(MyFIle, '0 ');
  342.          Writeln(MyFile);
  343.       end;
  344.       CloseFile(MyFile);
  345.       MessageDlg('Результат успешно сохранён', mtCustom, [mbOK], 0);
  346.    end;
  347. end;
  348.  
  349. procedure TForm1.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  350. var
  351.    IsValid: Boolean;
  352.    N, i, Value, Err, j: Integer;
  353.    MyFile: TextFile;
  354.    Check: String;
  355. const
  356.    Digit: set of Char = ['1', '0', ' '];
  357. begin
  358.    IsValid := True;
  359.    N := Length(OpenDialog1.FileName);
  360.    if (OpenDialog1.FileName[N] = 't') and (OpenDialog1.FileName[N - 1] = 'x') and (OpenDialog1.FileName[N - 2] = 't') then
  361.    begin
  362.       AssignFile(MyFile, OpenDialog1.FileName);
  363.       Reset(MyFile);
  364.       Read(MyFile, Check);
  365.       CloseFile(MyFile);
  366.       if Length(Check) = 0 then
  367.       begin
  368.          MessageDlg('Файл пуст', mtWarning, [mbOK], 0);
  369.          IsValid := False;
  370.       end
  371.       else
  372.       begin
  373.          AssignFile(MyFile, OpenDialog1.FileName);
  374.          Reset(MyFile);
  375.          try
  376.             Read(MyFile, SizeN);
  377.          except
  378.             IsValid := False;
  379.             MessageDlg('Порядок матрицы должен быть натуральным числом до 8', mtWarning, [mbOK], 0);
  380.          end;
  381.          if ((IsValid) and (SizeN < MIN_SIZE)) or ((IsValid) and (SizeN > MAX_SIZE)) then
  382.          begin
  383.             IsValid := False;
  384.             MessageDlg('Порядок матрицы должна быть натуральным числом до 8', mtError, [mbOK], 0);
  385.          end;
  386.          try
  387.             Readln(MyFile, SizeM);
  388.          except
  389.             IsValid := False;
  390.             MessageDlg('Порядок матрицы должен быть натуральным числом до 8', mtWarning, [mbOK], 0);
  391.          end;
  392.          if ((IsValid) and (SizeM < MIN_SIZE)) or ((IsValid) and (SizeM > MAX_SIZE)) then
  393.          begin
  394.             IsValid := False;
  395.             MessageDlg('Порядок матрицы должна быть натуральным числом до 8', mtError, [mbOK], 0);
  396.          end;
  397.          if IsValid then
  398.          begin
  399.             for j := 1 to SizeN do
  400.             begin
  401.                Readln(MyFile, Check);
  402.                i := 1;
  403.                while (IsValid) and (i <= Length(Check)) do
  404.                begin
  405.                   if not(Check[i] in Digit) then
  406.                   begin
  407.                      IsValid := False;
  408.                      MessageDlg('Элементами матрицы должны быть числа 0 или 1', mtWarning, [mbOK], 0);
  409.                   end;
  410.                   Inc(i);
  411.                end;
  412.             end;
  413.             Readln(MyFile, Check);
  414.                i := 1;
  415.                while (IsValid) and (i <= Length(Check)) do
  416.                begin
  417.                   if not(Check[i] in Digit) then
  418.                   begin
  419.                      IsValid := False;
  420.                      MessageDlg('Элементами матрицы должны быть числа 0 или 1', mtWarning, [mbOK], 0);
  421.                   end;
  422.                   Inc(i);
  423.                end;
  424.          end;
  425.          CloseFile(MyFile);
  426.       end;
  427.    end
  428.    else
  429.    begin
  430.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  431.       IsValid := False;
  432.    end;
  433.    if not(IsValid) then
  434.       CanClose := False;
  435. end;
  436.  
  437. procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  438. var
  439.    N: Integer;
  440. begin
  441.    N := Length(SaveDialog1.FileName);
  442.    if (SaveDialog1.FileName[N] = 't') and (SaveDialog1.FileName[N - 1] = 'x') and (SaveDialog1.FileName[N - 2] = 't') then
  443.       CanClose := True
  444.    else
  445.    begin
  446.       CanClose := False;
  447.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  448.    end;
  449. end;
  450.  
  451. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement