Advertisement
MaksNew

Untitled

Mar 3rd, 2021
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.46 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.Grids, Vcl.Menus, Vcl.StdCtrls;
  8.  
  9. Type
  10.   TListForm = class(TForm)
  11.     StringGrid1: TStringGrid;
  12.     ButtonAddElement: TButton;
  13.     MainMenu1: TMainMenu;
  14.     SaveFileButton: TMenuItem;
  15.     AllEntryButton: TMenuItem;
  16.     AboutButton: TMenuItem;
  17.     PopupMenu1: TPopupMenu;
  18.     DeleteRowButton: TMenuItem;
  19.     Button2: TButton;
  20.     SaveDialog: TSaveDialog;
  21.     procedure ButtonAddElementClick(Sender: TObject);
  22.     procedure FormCreate(Sender: TObject);
  23.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  24.     procedure DeleteRowButtonClick(Sender: TObject);
  25.     procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  26.       Shift: TShiftState; X, Y: Integer);
  27.     procedure Button2Click(Sender: TObject);
  28.     procedure AboutButtonClick(Sender: TObject);
  29.     procedure AllEntryButtonClick(Sender: TObject);
  30.     procedure SaveFileButtonClick(Sender: TObject);
  31.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  32.   Private
  33.   Public
  34.   End;
  35.  
  36. Var
  37.   ListForm: TListForm;
  38.   ACol, ADeletedRow: Integer;
  39.  
  40. Implementation
  41. Uses Unit2, Unit3;
  42.  
  43. {$R *.dfm}
  44.  
  45. Procedure CheckButton(RowCount:Word; SaveFileButton, AllEntryButton, DeleteRowButton:TMenuItem);
  46. Begin
  47.     If RowCount > 1 then
  48.     Begin
  49.         SaveFileButton.Enabled := True;
  50.         AllEntryButton.Enabled := True;
  51.         DeleteRowButton.Enabled := True;
  52.     End
  53.     Else
  54.     Begin
  55.         SaveFileButton.Enabled := False;
  56.         AllEntryButton.Enabled := False;
  57.         DeleteRowButton.Enabled := False;
  58.     End;
  59. End;
  60.  
  61. Procedure TListForm.ButtonAddElementClick(Sender: TObject);
  62. Begin
  63.     IsAdd := True;
  64.     FormAddElement.Caption := 'Add';
  65.     FormAddElement.Show;
  66.     CheckButton(StringGrid1.RowCount, SaveFileButton, AllEntryButton, DeleteRowButton);
  67. End;
  68.  
  69. Procedure TListForm.Button2Click(Sender: TObject);
  70. Begin
  71.     List.Debug();
  72. End;
  73.  
  74. Procedure TListForm.FormClose(Sender: TObject; var Action: TCloseAction);
  75. Begin
  76.     if IsDeleteble then
  77.         List.Destroy();
  78.     MainMenu.Close;
  79. End;
  80.  
  81. Procedure TListForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  82. Var
  83.     Choise: Integer;
  84. Begin
  85.     Choise := Messagedlg('Вы уверены, что хотите выйти?', mtinformation,
  86.         [mbYes, mbNo], 0);
  87.     Case Choise of
  88.         mrYes: CanClose:= True;
  89.         mrNo: CanClose:= False;
  90.     End;
  91. End;
  92.  
  93. Procedure TListForm.FormCreate(Sender: TObject);
  94. Begin
  95.     //Button2.Visible := False;
  96.     StringGrid1.RowCount := 1;
  97.     StringGrid1.Cells[0, 0] := '№';
  98.     StringGrid1.Cells[1, 0] := 'Элемент';
  99.     CheckButton(StringGrid1.RowCount, SaveFileButton, AllEntryButton, DeleteRowButton);
  100. End;
  101.  
  102. Procedure DeleteRow(ArrayOfElements: array of integer; DeletedRow: Integer; var MainStringGrid: TStringGrid);
  103. Var
  104.     I: Word;
  105. Begin
  106.     I := 1;
  107.     While (I < DeletedRow) do
  108.     Begin
  109.         ArrayOfElements[I-1] := StrToInt(MainStringGrid.Cells[1, I]);
  110.         Inc(I);
  111.     End;
  112.     I := DeletedRow + 1;
  113.     While (I <= MainStringGrid.RowCount-1) do
  114.     Begin
  115.         ArrayOfElements[I-2] := StrToInt(MainStringGrid.Cells[1, I]);
  116.         Inc(I);
  117.     End;
  118.     MainStringGrid.RowCount := MainStringGrid.RowCount - 1;
  119.     For I := 1 to MainStringGrid.RowCount do
  120.     Begin
  121.         MainStringGrid.Cells[1, I] := IntToStr(ArrayOfElements[I-1]);
  122.     End;
  123.     CheckButton(ListForm.StringGrid1.RowCount, ListForm.SaveFileButton, ListForm.AllEntryButton, ListForm.DeleteRowButton);
  124. End;
  125.  
  126. Procedure TListForm.AllEntryButtonClick(Sender: TObject);
  127. Begin
  128.     IsEnter := True;
  129.     FormAddElement.Caption := 'Enter';
  130.     FormAddElement.Show;
  131. End;
  132.  
  133. Procedure TListForm.AboutButtonClick(Sender: TObject);
  134. Begin
  135.     MessageDlg('Разработать программу работы с односвязным списком. Программа должна содержать следующие процедуры, вызываемые из меню:' +#13#10+ '- построение пустого списка;' +#13#10+ '- добавление нового элемента;'+#13#10+ '- удаление указанного элемента;'+#13#10+ '- подсчет количества всех вхождений заданного элемента;'+#13#10+ '- просмотр списка.', mtInformation, [mbOK], 0)
  136. End;
  137.  
  138. Procedure TListForm.DeleteRowButtonClick(Sender: TObject);
  139. Var
  140.     ArrayOfElements: array of integer;
  141. Begin
  142.     If StringGrid1.RowCount > 1 then
  143.     Begin
  144.         SetLength(ArrayOfElements, StringGrid1.RowCount-2);
  145.         List.Remove(ADeletedRow-1);
  146.         Dec(Count);
  147.         DeleteRow(ArrayOfElements, ADeletedRow, StringGrid1);
  148.     End;
  149.     CheckButton(StringGrid1.RowCount, SaveFileButton, AllEntryButton, DeleteRowButton);
  150. End;
  151.  
  152. Procedure TListForm.SaveFileButtonClick(Sender: TObject);
  153. Var
  154.     SaveFile: TextFile;
  155.     I: Word;
  156. Begin
  157.     If SaveDialog.Execute then
  158.     Begin
  159.         I := 1;
  160.         AssignFile(SaveFile, SaveDialog.FileName);
  161.         Rewrite(SaveFile);
  162.         While I < StringGrid1.RowCount do
  163.         Begin
  164.             Write(SaveFile, StringGrid1.Cells[1, I], ' ');
  165.             Inc(I);
  166.         End;
  167.         CloseFile(SaveFile);
  168.     End;
  169. End;
  170.  
  171. Procedure TListForm.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  172.   Shift: TShiftState; X, Y: Integer);
  173. Begin
  174.     StringGrid1.MouseToCell(X, Y, ACol, ADeletedRow);
  175. End;
  176.  
  177. End.
  178.  
  179.  
  180. Unit Unit2;
  181.  
  182. Interface
  183.  
  184. Uses
  185.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  186.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  187.  
  188. Type
  189.   TFormAddElement = class(TForm)
  190.     Label1: TLabel;
  191.     EditAdd: TEdit;
  192.     ButtonOK: TButton;
  193.     Procedure ButtonOKClick(Sender: TObject);
  194.     Procedure FormClose(Sender: TObject; var Action: TCloseAction);
  195.   Private
  196.   Public
  197.   end;
  198.  
  199. Type
  200.   SinglyLinkedList = class
  201.   Type PNode = ^TNode;   { указатель на узел }
  202.     TNode = record    { структура узла }
  203.        Element: Integer; { элемент }
  204.        Index: Word;    { индекс узла }
  205.        NextNode: PNode;      { ссылка на следующий }
  206.      End;
  207.   Private
  208.       FHeaderNode: PNode;
  209.       FLastNode: PNode;
  210.       Function IsEmpty: Boolean;
  211.       Function GetSize: Word;
  212.       Function NodeDataWithIndex(AIndex: Word): TNode;
  213.   Public
  214.       Constructor Create;
  215.       Destructor Destroy;
  216.       Procedure Append(ANodeElement: Integer);
  217.       Function ShowCountElementEnter(Element: Word): Word;
  218.       Procedure Clear;
  219.       Function PopLast: Integer;
  220.       Procedure Remove(AIndex: Word);
  221.       Procedure Debug;
  222.   End;
  223.  
  224. Var
  225.     FormAddElement: TFormAddElement;
  226.     List: SinglyLinkedList;
  227.     IsDeleteble: Boolean = False;
  228.     IsAdd: Boolean = False;
  229.     IsEnter: Boolean = False;
  230.     Count: Integer = 1;
  231.  
  232. Implementation
  233. Uses Unit1;
  234.  
  235. Procedure SinglyLinkedList.Debug();
  236. Var
  237.     CurNode: PNode;
  238. Begin
  239.     CurNode := FHeaderNode^.NextNode;
  240.     While CurNode <> Nil do
  241.     Begin
  242.         ShowMessage(IntToStr(CurNode^.Element));
  243.         CurNode := CurNode^.NextNode;
  244.     End;
  245. End;
  246.  
  247. Function SinglyLinkedList.IsEmpty: Boolean;
  248. Begin
  249.     if FHeaderNode^.NextNode = Nil then
  250.         IsEmpty := True
  251.     else
  252.         IsEmpty := False;
  253. End;
  254.  
  255. Function SinglyLinkedList.ShowCountElementEnter(Element: Word): Word;
  256. Var
  257.     Count, I: Word;
  258. Begin
  259.     Count := 0;
  260.     I := 0;
  261.     While I < GetSize do
  262.     Begin
  263.         if (Element = NodeDataWithIndex(I).NextNode.Element) then
  264.             Inc(Count);
  265.         Inc(I);
  266.     End;
  267.     ShowCountElementEnter := Count;
  268. End;
  269.  
  270. Function SinglyLinkedList.GetSize: Word;
  271. Var
  272.     CurrentNode: TNode;
  273. Begin
  274.     If IsEmpty then
  275.         GetSize := 0
  276.     Else
  277.     Begin
  278.         CurrentNode.NextNode := FHeaderNode^.NextNode;
  279.         CurrentNode.Index := 0;
  280.         While CurrentNode.NextNode <> Nil do
  281.         Begin
  282.             CurrentNode.NextNode := CurrentNode.NextNode^.NextNode;
  283.             Inc(currentNode.Index);
  284.         End;
  285.         GetSize := CurrentNode.Index;
  286.     End;
  287. End;
  288.  
  289. Constructor SinglyLinkedList.Create();
  290. Begin
  291.     New(FHeaderNode);
  292.     FHeaderNode^.NextNode := Nil;
  293.     FLastNode := FHeaderNode;
  294. End;
  295.  
  296. Destructor SinglyLinkedList.Destroy;
  297. Begin
  298.     Clear;
  299.     Dispose(FHeaderNode);
  300. End;
  301.  
  302. Function SinglyLinkedList.NodeDataWithIndex(AIndex: Word): TNode;
  303. Var
  304.     CurrentData: TNode;
  305. Begin
  306.     CurrentData.NextNode := FHeaderNode^.NextNode;
  307.     CurrentData.Index := 0;
  308.     While CurrentData.Index <> AIndex do
  309.     Begin
  310.         CurrentData.NextNode := CurrentData.NextNode^.NextNode;
  311.         Inc(CurrentData.Index);
  312.     End;
  313.     NodeDataWithIndex := CurrentData;
  314. End;
  315.  
  316. Procedure SinglyLinkedList.Append(ANodeElement: Integer);
  317. Var
  318.     CurrentNode: PNode;
  319. Begin
  320.     CurrentNode := FLastNode;
  321.     New(CurrentNode^.NextNode);
  322.     CurrentNode := CurrentNode^.NextNode;
  323.     CurrentNode^.Element := ANodeElement;
  324.     CurrentNode^.NextNode := Nil;
  325.     FLastNode := CurrentNode;
  326. End;
  327.  
  328. Procedure SinglyLinkedList.Clear;
  329. Begin
  330.     While FHeaderNode^.NextNode <> Nil do
  331.         PopLast;
  332. End;
  333.  
  334. Function SinglyLinkedList.PopLast: Integer;
  335. Var
  336.     I: Word;
  337.     CurrentNode: PNode;
  338. Begin
  339.     If FHeaderNode^.NextNode <> Nil then
  340.     Begin
  341.         CurrentNode := FHeaderNode;
  342.         While CurrentNode^.NextNode <> FLastNode do
  343.             CurrentNode := CurrentNode^.NextNode;
  344.  
  345.         PopLast := FLastNode^.Element;
  346.  
  347.         Dispose(CurrentNode^.NextNode);
  348.         FLastNode := CurrentNode;
  349.         FLastNode^.NextNode := Nil;
  350.     End;
  351. End;
  352.  
  353. Procedure SinglyLinkedList.Remove(AIndex: Word);
  354. Var
  355.     CurrentData: TNode;
  356.     BuffLastNode: PNode;
  357. Begin
  358.     If AIndex = 0 then
  359.     Begin
  360.         CurrentData.NextNode := FHeaderNode;
  361.         CurrentData.Index := 0;
  362.     End
  363.     Else
  364.         CurrentData := NodeDataWithIndex(AIndex - 1);
  365.     If AIndex = GetSize-1 then
  366.         PopLast
  367.     Else
  368.     Begin
  369.         BuffLastNode := FLastNode;
  370.         FLastNode := CurrentData.NextNode^.NextNode;
  371.         CurrentData.NextNode^.NextNode := FLastNode^.NextNode;
  372.         FLastNode := BuffLastNode;
  373.     End;
  374. End;
  375.  
  376. {$R *.dfm}
  377.  
  378. Function IsElementCorrect(EditAdd:TEdit):Boolean;
  379. Var
  380.     IsCorrect: Boolean;
  381. Begin
  382.     IsCorrect := True;
  383.     Try
  384.         StrToInt(EditAdd.Text)
  385.     Except
  386.         IsCorrect := False;
  387.     End;
  388.     IsElementCorrect := IsCorrect;
  389. End;
  390.  
  391.  
  392. Procedure TFormAddElement.ButtonOKClick(Sender: TObject);
  393. Var
  394.     Element: Integer;
  395. Begin
  396.     If IsAdd then
  397.     Begin
  398.         If count = 1 then
  399.         Begin
  400.             List := SinglyLinkedList.Create();
  401.             IsDeleteble := True;
  402.         End;
  403.         If IsElementCorrect(EditAdd) then
  404.         Begin
  405.             Element := StrToInt(EditAdd.Text);
  406.             ListForm.StringGrid1.Cells[1,count] := EditAdd.Text;
  407.             ListForm.StringGrid1.Cells[0,count] := IntToStr(Count);
  408.             ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
  409.             List.Append(Element);
  410.             Inc(Count);
  411.             EditAdd.Text := '';
  412.             IsAdd := False;
  413.             FormAddElement.Close;
  414.         End
  415.         Else
  416.             MessageDlg('Введите целое число в пределах +- 2*10^9!', mtError, [mbOK], 0)
  417.     End;
  418.     If IsEnter then
  419.     Begin
  420.         If IsElementCorrect(EditAdd) then
  421.         Begin
  422.             Element := StrToInt(EditAdd.Text);
  423.             ShowMessage(IntToStr(List.ShowCountElementEnter(Element)));
  424.             IsEnter := False;
  425.             FormAddElement.Close;
  426.         End;
  427.     End;
  428. End;
  429.  
  430. Procedure TFormAddElement.FormClose(Sender: TObject; var Action: TCloseAction);
  431. Begin
  432.     IsEnter := False;
  433.     IsAdd := False;
  434.     EditAdd.Text := '';
  435. End;
  436.  
  437. End.
  438.  
  439.  
  440. Unit Unit3;
  441.  
  442. Interface
  443.  
  444. Uses
  445.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  446.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  447.  
  448. Type
  449.   TMainMenu = class(TForm)
  450.     Label1: TLabel;
  451.     ButtonOpenFile: TButton;
  452.     ButtonCreateNewFile: TButton;
  453.     OpenDialog: TOpenDialog;
  454.     Procedure ButtonCreateNewFileClick(Sender: TObject);
  455.     Procedure ButtonOpenFileClick(Sender: TObject);
  456.   Private
  457.   Public
  458.   End;
  459.  
  460. Var
  461.   MainMenu: TMainMenu;
  462.  
  463. Implementation
  464. Uses Unit1, Unit2;
  465.  
  466. {$R *.dfm}
  467.  
  468. Function IsFileCorrect(var UserFile:TextFile):Boolean;
  469. Var
  470.     Number:Integer;
  471.     IsCorrect: Boolean;
  472. Begin
  473.     IsCorrect := True;
  474.     Reset(UserFile);
  475.     While Not(eof(UserFile)) and IsCorrect do
  476.         While not(eoln(UserFile)) and IsCorrect do
  477.             Try
  478.                 Read(UserFile, Number);
  479.             Except
  480.                 IsCorrect := False;
  481.             End;
  482.     CloseFile(UserFile);
  483.     IsFileCorrect := IsCorrect;
  484. End;
  485.  
  486. Procedure TMainMenu.ButtonOpenFileClick(Sender: TObject);
  487. Var
  488.     UserFile:TextFile;
  489.     Number: Integer;
  490. Begin
  491.     If OpenDialog.Execute then
  492.     Begin
  493.         AssignFile(UserFile, OpenDialog.FileName);
  494.         if IsFileCorrect(UserFile) then
  495.         Begin
  496.             ListForm.Show;
  497.             MainMenu.Visible := False;
  498.             Reset(UserFile);
  499.             List := SinglyLinkedList.Create();
  500.             IsDeleteble := True;
  501.             ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
  502.             While Not(eof(UserFile)) do
  503.                 While not(eoln(UserFile)) do
  504.                 Begin
  505.                     Read(UserFile, Number);
  506.                     ListForm.StringGrid1.Cells[1,count] := IntToStr(Number);
  507.                     ListForm.StringGrid1.Cells[0,count] := IntToStr(Count);
  508.                     ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
  509.                     List.Append(Number);
  510.                     Inc(Count);
  511.                 End;
  512.             ListForm.SaveFileButton.Enabled := True;
  513.             ListForm.AllEntryButton.Enabled := True;
  514.             ListForm.DeleteRowButton.Enabled := True;
  515.             ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount - 1;
  516.             IsAdd := False;
  517.             CloseFile(UserFile);
  518.         End
  519.         Else
  520.             MessageDlg('Проверьте данные в файле! Это должны быть числа в диапазоне +-2*10^9!', mtError, [mbOK], 0)
  521.     End;
  522. End;
  523.  
  524. Procedure TMainMenu.ButtonCreateNewFileClick(Sender: TObject);
  525. Begin
  526.     ListForm.Show;
  527.     MainMenu.Visible := False;
  528. End;
  529.  
  530. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement