Advertisement
SmnVadik

Lab 7.3 (Delphi)

Sep 13th, 2023
485
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 15.39 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  7.     System.Classes, Vcl.Graphics,
  8.     Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Generics.Collections,
  9.     Vcl.Grids, Vcl.Menus;
  10.  
  11. type
  12.     TForm1 = class(TForm)
  13.         Memo1: TMemo;
  14.         ButtonFind: TButton;
  15.         LabelTask: TLabel;
  16.         StringGridEdges: TStringGrid;
  17.         EditEdges: TEdit;
  18.         ButtonEdges: TButton;
  19.         LabelMaxEdges: TLabel;
  20.         LabelVertices: TLabel;
  21.         EditVertices: TEdit;
  22.         LabelInfo: TLabel;
  23.         ButtonAdd: TButton;
  24.         LabelEdges: TLabel;
  25.         MainMenu1: TMainMenu;
  26.         N1: TMenuItem;
  27.         N2: TMenuItem;
  28.         N3: TMenuItem;
  29.         N4: TMenuItem;
  30.         N5: TMenuItem;
  31.         OpenDialog1: TOpenDialog;
  32.         SaveDialog1: TSaveDialog;
  33.         procedure ButtonFindClick(Sender: TObject);
  34.         procedure FormCreate(Sender: TObject);
  35.         procedure ButtonEdgesClick(Sender: TObject);
  36.         procedure ButtonAddClick(Sender: TObject);
  37.         procedure EditVerticesChange(Sender: TObject);
  38.         procedure EditVerticesKeyPress(Sender: TObject; var Key: Char);
  39.         procedure EditEdgesChange(Sender: TObject);
  40.         procedure EditEdgesKeyPress(Sender: TObject; var Key: Char);
  41.         procedure StringGridEdgesSetEditText(Sender: TObject;
  42.           ACol, ARow: Integer; const Value: string);
  43.         procedure StringGridEdgesKeyPress(Sender: TObject; var Key: Char);
  44.         procedure N3Click(Sender: TObject);
  45.         procedure N2Click(Sender: TObject);
  46.         procedure N4Click(Sender: TObject);
  47.         procedure N5Click(Sender: TObject);
  48.     private
  49.         { Private declarations }
  50.     public
  51.         { Public declarations }
  52.     end;
  53.  
  54. var
  55.     Form1: TForm1;
  56.     MaxAmountEdges: Double;
  57.     Path: String;
  58.     IsFileOpen: Boolean;
  59.  
  60. type
  61.     TGraph = TObjectList<TList<Integer>>;
  62.  
  63.     // procedure AddEdge(graph: TGraph; u, v: Integer);
  64.     // function FindVertexCover(graph: TGraph): TList<Integer>;
  65.  
  66. implementation
  67.  
  68. {$R *.dfm}
  69.  
  70. procedure AddEdge(graph: TGraph; u, v: Integer);
  71. begin
  72.     graph[u].Add(v);
  73.     graph[v].Add(u);
  74. end;
  75.  
  76. function FindVertexCover(graph: TGraph): TList<Integer>;
  77. var
  78.     vertexCover: TList<Integer>;
  79.     visited: array of Boolean;
  80.     i, u, v: Integer;
  81. begin
  82.     SetLength(visited, graph.Count);
  83.     vertexCover := TList<Integer>.Create;
  84.  
  85.     for i := 0 to graph.Count - 1 do
  86.         visited[i] := False;
  87.  
  88.     for u := 0 to graph.Count - 1 do
  89.     begin
  90.         if not visited[u] then
  91.         begin
  92.             for v in graph[u] do
  93.             begin
  94.                 if not visited[v] then
  95.                 begin
  96.                     visited[u] := True;
  97.                     visited[v] := True;
  98.                     vertexCover.Add(u);
  99.                     vertexCover.Add(v);
  100.                     Break;
  101.                 end;
  102.             end;
  103.         end;
  104.     end;
  105.  
  106.     {
  107.       for i := 0 to graph.Count - 1 do
  108.       begin
  109.       if not visited[i] then
  110.       vertexCover.Add(i);
  111.       end;
  112.     }
  113.  
  114.     Result := vertexCover;
  115. end;
  116.  
  117. procedure TForm1.ButtonFindClick(Sender: TObject);
  118. var
  119.     graph: TGraph;
  120.     vertexCover: TList<Integer>;
  121.     i, AmountVertices, Num1, Num2: Integer;
  122.     text: String;
  123. begin
  124.     Memo1.Clear;
  125.     N5.Enabled := True;
  126.     AmountVertices := StrToInt(EditVertices.text);
  127.     // Создаем граф
  128.     graph := TGraph.Create;
  129.     try
  130.         // Добавляем вершины
  131.         for i := 0 to AmountVertices - 1 do // 5
  132.             graph.Add(TList<Integer>.Create);
  133.  
  134.         // Добавляем ребра в граф
  135.         {
  136.           AddEdge(graph, 0, 1);
  137.           AddEdge(graph, 0, 2);
  138.           AddEdge(graph, 1, 3);
  139.           AddEdge(graph, 1, 4);
  140.           AddEdge(graph, 2, 5);
  141.           AddEdge(graph, 3, 5);
  142.           AddEdge(graph, 4, 5);
  143.         }
  144.         For i := 1 to StringGridEdges.RowCount - 1 do
  145.         Begin
  146.             Num1 := StrToInt(StringGridEdges.Cells[1, i]);
  147.             Num2 := StrToInt(StringGridEdges.Cells[2, i]);
  148.             AddEdge(graph, Num1, Num2);
  149.         End;
  150.  
  151.         // Находим вершинное покрытие
  152.         vertexCover := FindVertexCover(graph);
  153.  
  154.         // Выводим результат
  155.         Memo1.Lines.Add('Вершинное покрытие графа:');
  156.         for i := 0 to vertexCover.Count - 1 do
  157.             text := text + IntToStr(vertexCover[i]) + ' ';
  158.         Memo1.Lines.Add(text);
  159.     finally
  160.         // Освобождаем память
  161.         for i := 0 to graph.Count - 1 do
  162.             graph[i].Free;
  163.         // graph.Free;
  164.         vertexCover.Free;
  165.     end;
  166. end;
  167.  
  168. procedure TForm1.ButtonAddClick(Sender: TObject);
  169. var
  170.     i, Size: Integer;
  171. begin
  172.     Memo1.Clear;
  173.     for i := 1 to StringGridEdges.RowCount - 1 do
  174.         StringGridEdges.Rows[i].Clear;
  175.     Size := StrToInt(EditEdges.text);
  176.     If Size <= MaxAmountEdges Then
  177.     Begin
  178.         StringGridEdges.RowCount := Size + 1;
  179.         For i := 1 to StringGridEdges.RowCount - 1 do
  180.         Begin
  181.             StringGridEdges.Cells[0, i] := IntToStr(i);
  182.         End;
  183.     End;
  184.     N5.Enabled := False;
  185.     ButtonFind.Enabled := False;
  186. end;
  187.  
  188. procedure TForm1.ButtonEdgesClick(Sender: TObject);
  189. var
  190.     i, Num: Integer;
  191. begin
  192.     Num := StrToInt(EditVertices.text);
  193.     MaxAmountEdges := 0.5 * (Num - 1) * Num;
  194.     LabelMaxEdges.Caption := '';
  195.     LabelMaxEdges.Caption := 'Максимальное количество ребер: ' +
  196.       FloatToStr(MaxAmountEdges);
  197.     for i := 1 to StringGridEdges.RowCount - 1 do
  198.         StringGridEdges.Rows[i].Clear;
  199.     EditEdges.text := '';
  200.     StringGridEdges.RowCount := 1;
  201.     N5.Enabled := False;
  202.     ButtonFind.Enabled := False;
  203.     LabelMaxEdges.Visible := True;
  204.     Memo1.Clear;
  205. end;
  206.  
  207. procedure TForm1.EditEdgesChange(Sender: TObject);
  208. var
  209.     Num, i: Integer;
  210.     IsCorrect: Boolean;
  211. begin
  212.     IsCorrect := True;
  213.     try
  214.         Num := StrToInt(EditEdges.text);
  215.     except
  216.         IsCorrect := True
  217.     end;
  218.     If IsCorrect And ((Num > MaxAmountEdges) Or (Num < 1)) Then
  219.         IsCorrect := False;
  220.     ButtonAdd.Enabled := IsCorrect;
  221.     N5.Enabled := False;
  222.     ButtonFind.Enabled := False;
  223.     Memo1.Clear;
  224.     for i := 1 to StringGridEdges.RowCount - 1 do
  225.         StringGridEdges.Rows[i].Clear
  226. end;
  227.  
  228. procedure TForm1.EditEdgesKeyPress(Sender: TObject; var Key: Char);
  229. begin
  230.     If not(Key in ['0' .. '9', #13, #8]) Then
  231.         Key := #0;
  232.     If ButtonAdd.Enabled And (Key = #13) Then
  233.         ButtonAdd.Click
  234. end;
  235.  
  236. procedure TForm1.EditVerticesChange(Sender: TObject);
  237. var
  238.     Num, i: Integer;
  239.     IsCorrect: Boolean;
  240. begin
  241.     IsCorrect := True;
  242.     try
  243.         Num := StrToInt(EditVertices.text);
  244.     except
  245.         IsCorrect := True
  246.     end;
  247.     If IsCorrect And ((Num > 10) Or (Num < 3)) Then
  248.         IsCorrect := False;
  249.     ButtonEdges.Enabled := IsCorrect;
  250.     LabelMaxEdges.Visible := False;
  251.     EditEdges.text := '';
  252.     N5.Enabled := False;
  253.     ButtonFind.Enabled := False;
  254.     Memo1.Clear;
  255.     for i := 1 to StringGridEdges.RowCount - 1 do
  256.         StringGridEdges.Rows[i].Clear
  257. end;
  258.  
  259. procedure TForm1.EditVerticesKeyPress(Sender: TObject; var Key: Char);
  260. begin
  261.     If not(Key in ['0' .. '9', #13, #8]) Then
  262.         Key := #0;
  263.     If ButtonEdges.Enabled And (Key = #13) Then
  264.         ButtonEdges.Click
  265. end;
  266.  
  267. procedure TForm1.FormCreate(Sender: TObject);
  268. begin
  269.     StringGridEdges.Cells[0, 0] := '№/№';
  270.     StringGridEdges.Cells[1, 0] := 'верш.1';
  271.     StringGridEdges.Cells[2, 0] := 'верш.2';
  272. end;
  273.  
  274. procedure TForm1.N2Click(Sender: TObject);
  275. const
  276.     Info1 = 'Найти вершинное покрытие графа.'#13#10;
  277.     Info2 = 'Максимальное количество вершин - 10, минимальное - 3.'#13#10;
  278.     Info3 = 'Количество ребер вводить нужно не больше максимального.'#13#10;
  279.     Info4 = 'Нумерация вершин начинается с нуля';
  280. begin
  281.     Application.MessageBox(Info1 + Info2 + Info3 + Info4, 'Справка', 0)
  282. end;
  283.  
  284. procedure TForm1.N3Click(Sender: TObject);
  285. begin
  286.     Application.MessageBox('Сымоник Вадим, гр. 251004', 'Разработчик', 0)
  287. end;
  288.  
  289. Function GetVertices(var FileInput: TextFile): String;
  290. Const
  291.     MIN_NUM = 3;
  292.     MAX_NUM = 10;
  293. Var
  294.     Size, Num: Integer;
  295.     Str: String;
  296.     IsCorrect: Boolean;
  297. Begin
  298.     Size := 0;
  299.     Str := '';
  300.     If Not Eof(FileInput) Then
  301.     Begin
  302.         IsCorrect := True;
  303.         Try
  304.             Read(FileInput, Size);
  305.         Except
  306.             MessageBox(Form1.Handle, PChar('Недопустимый размер графа!'),
  307.               'Ошибка', MB_ICONSTOP);
  308.             IsCorrect := False;
  309.             Size := 0;
  310.         End;
  311.     End
  312.     Else
  313.         MessageBox(Form1.Handle, PChar('Недостаточно данных в файле!'),
  314.           'Ошибка', MB_ICONSTOP);
  315.     If (Size >= MIN_NUM) And (Size <= MAX_NUM) Then
  316.         Str := IntToStr(Size)
  317.     Else
  318.         Application.MessageBox('Проверьте корректность данных в файле',
  319.           'Ошибка', 0);
  320.     GetVertices := Str;
  321. End;
  322.  
  323. Function GetEdges(var FileInput: TextFile): String;
  324. Const
  325.     MIN_NUM = 1;
  326. Var
  327.     Size, Num: Integer;
  328.     Str: String;
  329.     IsCorrect: Boolean;
  330. Begin
  331.     Size := 0;
  332.     Str := '';
  333.     If Not Eof(FileInput) Then
  334.     Begin
  335.         IsCorrect := True;
  336.         Try
  337.             Read(FileInput, Size);
  338.         Except
  339.             MessageBox(Form1.Handle, PChar('Недопустимый количество ребер!'),
  340.               'Ошибка', MB_ICONSTOP);
  341.             IsCorrect := False;
  342.             Size := 0;
  343.         End;
  344.     End
  345.     Else
  346.         MessageBox(Form1.Handle, PChar('Недостаточно данных в файле!'),
  347.           'Ошибка', MB_ICONSTOP);
  348.     If (Size >= MIN_NUM) And (Size <= MaxAmountEdges) Then
  349.         Str := IntToStr(Size)
  350.     Else
  351.         Application.MessageBox('Проверьте корректность данных в файле',
  352.           'Ошибка', 0);
  353.     GetEdges := Str;
  354. End;
  355.  
  356. Function TakeInformationIntoCell(Var FileInput: TextFile;
  357.   Var IsCorrect: Boolean): String;
  358. Var
  359.     Temp, MaxNum: Integer;
  360.     Str: String;
  361. Begin
  362.     If Not Eof(FileInput) Then
  363.     Begin
  364.         Try
  365.             Read(FileInput, Temp);
  366.             Str := IntToStr(Temp);
  367.         Except
  368.             MessageBox(Form1.Handle, PChar('Неверные данные!'), 'Ошибка',
  369.               MB_ICONSTOP);
  370.             IsCorrect := False;
  371.         End;
  372.         MaxNum := StrToInt(Form1.EditVertices.text) - 1;
  373.         If IsCorrect And (Temp < 0) And (Temp > MaxNum) Then
  374.         Begin
  375.             IsCorrect := False;
  376.             MessageBox(Form1.Handle,
  377.               PChar('Недопустимый диапазон входных данных!'), 'Ошибка',
  378.               MB_ICONSTOP);
  379.             Str := '';
  380.         End;
  381.     End
  382.     Else
  383.     Begin
  384.         IsCorrect := False;
  385.         MessageBox(Form1.Handle, PChar('Недостаточно значений в файле!'),
  386.           'Ошибка', MB_ICONSTOP);
  387.         Str := '';
  388.     End;
  389.     TakeInformationIntoCell := Str;
  390. End;
  391.  
  392. Procedure InputPointsInMatrix(var FileInput: TextFile);
  393. Var
  394.     i, J: Integer;
  395.     IsCorrect: Boolean;
  396. Begin
  397.     IsCorrect := True;
  398.     With Form1 do
  399.     Begin
  400.         For i := 1 to StringGridEdges.RowCount - 1 do
  401.         Begin
  402.             For J := 1 to StringGridEdges.ColCount - 1 do
  403.             Begin
  404.                 StringGridEdges.Cells[J, i] :=
  405.                   TakeInformationIntoCell(FileInput, IsCorrect);
  406.             End;
  407.         End;
  408.         ButtonFind.Enabled := IsCorrect;
  409.     End;
  410. End;
  411.  
  412. procedure TForm1.N4Click(Sender: TObject);
  413. var
  414.     FileInput: TextFile;
  415.     Num: Integer;
  416. begin
  417.     If OpenDialog1.Execute Then
  418.     Begin
  419.         AssignFile(FileInput, OpenDialog1.FileName);
  420.         Try
  421.             Try
  422.                 Reset(FileInput);
  423.                 EditVertices.text := GetVertices(FileInput);
  424.                 if EditVertices.text <> '' then
  425.                 Begin
  426.                     ButtonEdges.Click;
  427.                     EditEdges.text := GetEdges(FileInput);
  428.                     If EditEdges.text <> '' Then
  429.                     Begin
  430.                         ButtonAdd.Click;
  431.                         InputPointsInMatrix(FileInput);
  432.                     End;
  433.                 End;
  434.             Finally
  435.                 CloseFile(FileInput);
  436.             End;
  437.         Except
  438.  
  439.         End;
  440.     End;
  441. end;
  442.  
  443. Function Open(): String;
  444. begin
  445.     with Form1 Do
  446.     begin
  447.         If SaveDialog1.Execute Then
  448.         begin
  449.             Path := SaveDialog1.FileName;
  450.             IsFileOpen := True;
  451.         end
  452.         Else
  453.             IsFileOpen := False;
  454.     end;
  455.     Open := Path;
  456. end;
  457.  
  458. procedure TForm1.N5Click(Sender: TObject);
  459. var
  460.     F: TextFile;
  461. begin
  462.     Path := Open;
  463.     If IsFileOpen Then
  464.     Begin
  465.         AssignFile(F, Path);
  466.         Rewrite(F);
  467.         Writeln(F, Memo1.text);
  468.         Application.MessageBox('Данные успешно сохранены в файл',
  469.           'Результат', 0);
  470.         CloseFile(F);
  471.     End;
  472. end;
  473.  
  474. procedure TForm1.StringGridEdgesKeyPress(Sender: TObject; var Key: Char);
  475. begin
  476.     If not(Key in ['0' .. '9', #13, #8]) Then
  477.         Key := #0;
  478.     If ButtonFind.Enabled And (Key = #13) Then
  479.         ButtonFind.Click
  480. end;
  481.  
  482. procedure TForm1.StringGridEdgesSetEditText(Sender: TObject;
  483.   ACol, ARow: Integer; const Value: string);
  484. var
  485.     i, J: Integer;
  486.     N, MaxNum, Num: Integer;
  487.     IsCorrect: Boolean;
  488. begin
  489.     For i := 1 to StringGridEdges.RowCount - 1 do
  490.     Begin
  491.         for J := 1 to StringGridEdges.ColCount - 1 do
  492.         Begin
  493.             IsCorrect := True;
  494.             If StringGridEdges.Cells[J, i] <> '' Then
  495.             Begin
  496.                 Try
  497.                     N := StrToInt(StringGridEdges.Cells[J, i]);
  498.                 Except
  499.                     StringGridEdges.Cells[J, i] := '';
  500.                     Application.MessageBox
  501.                       ('Проверьте корректность введенных данных!', 'Ошибка', 0);
  502.                     IsCorrect := False;
  503.                 End;
  504.                 MaxNum := StrToInt(EditVertices.text) - 1;
  505.                 If IsCorrect And ((N < 0) Or (N > MaxNum)) Then
  506.                 Begin
  507.                     StringGridEdges.Cells[J, i] := '';
  508.                     Application.MessageBox('Нет такой вершины!', 'Ошибка', 0);
  509.                 End;
  510.             End;
  511.         End;
  512.     End;
  513.  
  514.     For i := 1 to StringGridEdges.RowCount - 1 do
  515.     Begin
  516.         If (StringGridEdges.Cells[2, i] <> '') And
  517.           (StringGridEdges.Cells[2, i] = StringGridEdges.Cells[1, i]) Then
  518.         Begin
  519.             Application.MessageBox('Нельзя вводить одинаковые вершины',
  520.               'Предупрреждение', 0);
  521.             StringGridEdges.Cells[2, i] := ''
  522.         End;
  523.     End;
  524.  
  525.     For J := 1 to StringGridEdges.RowCount - 1 do
  526.         for i := 1 to StringGridEdges.ColCount - 1 do
  527.             If Length(StringGridEdges.Cells[i, J]) = 0 Then
  528.                 IsCorrect := False;
  529.     ButtonFind.Enabled := IsCorrect;
  530.     Memo1.Clear;
  531.     N5.Enabled := False;
  532. end;
  533.  
  534. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement