Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Unit Unit1;
- Interface
- Uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.Menus, Vcl.StdCtrls;
- Type
- TListForm = class(TForm)
- StringGrid1: TStringGrid;
- ButtonAddElement: TButton;
- MainMenu1: TMainMenu;
- SaveFileButton: TMenuItem;
- AllEntryButton: TMenuItem;
- AboutButton: TMenuItem;
- PopupMenu1: TPopupMenu;
- DeleteRowButton: TMenuItem;
- Button2: TButton;
- SaveDialog: TSaveDialog;
- procedure ButtonAddElementClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure DeleteRowButtonClick(Sender: TObject);
- procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure Button2Click(Sender: TObject);
- procedure AboutButtonClick(Sender: TObject);
- procedure AllEntryButtonClick(Sender: TObject);
- procedure SaveFileButtonClick(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- Private
- Public
- End;
- Var
- ListForm: TListForm;
- ACol, ADeletedRow: Integer;
- Implementation
- Uses Unit2, Unit3;
- {$R *.dfm}
- Procedure CheckButton(RowCount:Word; SaveFileButton, AllEntryButton, DeleteRowButton:TMenuItem);
- Begin
- If RowCount > 1 then
- Begin
- SaveFileButton.Enabled := True;
- AllEntryButton.Enabled := True;
- DeleteRowButton.Enabled := True;
- End
- Else
- Begin
- SaveFileButton.Enabled := False;
- AllEntryButton.Enabled := False;
- DeleteRowButton.Enabled := False;
- End;
- End;
- Procedure TListForm.ButtonAddElementClick(Sender: TObject);
- Begin
- IsAdd := True;
- FormAddElement.Caption := 'Add';
- FormAddElement.Show;
- CheckButton(StringGrid1.RowCount, SaveFileButton, AllEntryButton, DeleteRowButton);
- End;
- Procedure TListForm.Button2Click(Sender: TObject);
- Begin
- List.Debug();
- End;
- Procedure TListForm.FormClose(Sender: TObject; var Action: TCloseAction);
- Begin
- if IsDeleteble then
- List.Destroy();
- MainMenu.Close;
- End;
- Procedure TListForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- Var
- Choise: Integer;
- Begin
- Choise := Messagedlg('Вы уверены, что хотите выйти?', mtinformation,
- [mbYes, mbNo], 0);
- Case Choise of
- mrYes: CanClose:= True;
- mrNo: CanClose:= False;
- End;
- End;
- Procedure TListForm.FormCreate(Sender: TObject);
- Begin
- //Button2.Visible := False;
- StringGrid1.RowCount := 1;
- StringGrid1.Cells[0, 0] := '№';
- StringGrid1.Cells[1, 0] := 'Элемент';
- CheckButton(StringGrid1.RowCount, SaveFileButton, AllEntryButton, DeleteRowButton);
- End;
- Procedure DeleteRow(ArrayOfElements: array of integer; DeletedRow: Integer; var MainStringGrid: TStringGrid);
- Var
- I: Word;
- Begin
- I := 1;
- While (I < DeletedRow) do
- Begin
- ArrayOfElements[I-1] := StrToInt(MainStringGrid.Cells[1, I]);
- Inc(I);
- End;
- I := DeletedRow + 1;
- While (I <= MainStringGrid.RowCount-1) do
- Begin
- ArrayOfElements[I-2] := StrToInt(MainStringGrid.Cells[1, I]);
- Inc(I);
- End;
- MainStringGrid.RowCount := MainStringGrid.RowCount - 1;
- For I := 1 to MainStringGrid.RowCount do
- Begin
- MainStringGrid.Cells[1, I] := IntToStr(ArrayOfElements[I-1]);
- End;
- CheckButton(ListForm.StringGrid1.RowCount, ListForm.SaveFileButton, ListForm.AllEntryButton, ListForm.DeleteRowButton);
- End;
- Procedure TListForm.AllEntryButtonClick(Sender: TObject);
- Begin
- IsEnter := True;
- FormAddElement.Caption := 'Enter';
- FormAddElement.Show;
- End;
- Procedure TListForm.AboutButtonClick(Sender: TObject);
- Begin
- MessageDlg('Разработать программу работы с односвязным списком. Программа должна содержать следующие процедуры, вызываемые из меню:' +#13#10+ '- построение пустого списка;' +#13#10+ '- добавление нового элемента;'+#13#10+ '- удаление указанного элемента;'+#13#10+ '- подсчет количества всех вхождений заданного элемента;'+#13#10+ '- просмотр списка.', mtInformation, [mbOK], 0)
- End;
- Procedure TListForm.DeleteRowButtonClick(Sender: TObject);
- Var
- ArrayOfElements: array of integer;
- Begin
- If StringGrid1.RowCount > 1 then
- Begin
- SetLength(ArrayOfElements, StringGrid1.RowCount-2);
- List.Remove(ADeletedRow-1);
- Dec(Count);
- DeleteRow(ArrayOfElements, ADeletedRow, StringGrid1);
- End;
- CheckButton(StringGrid1.RowCount, SaveFileButton, AllEntryButton, DeleteRowButton);
- End;
- Procedure TListForm.SaveFileButtonClick(Sender: TObject);
- Var
- SaveFile: TextFile;
- I: Word;
- Begin
- If SaveDialog.Execute then
- Begin
- I := 1;
- AssignFile(SaveFile, SaveDialog.FileName);
- Rewrite(SaveFile);
- While I < StringGrid1.RowCount do
- Begin
- Write(SaveFile, StringGrid1.Cells[1, I], ' ');
- Inc(I);
- End;
- CloseFile(SaveFile);
- End;
- End;
- Procedure TListForm.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- Begin
- StringGrid1.MouseToCell(X, Y, ACol, ADeletedRow);
- End;
- End.
- Unit Unit2;
- Interface
- Uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
- Type
- TFormAddElement = class(TForm)
- Label1: TLabel;
- EditAdd: TEdit;
- ButtonOK: TButton;
- Procedure ButtonOKClick(Sender: TObject);
- Procedure FormClose(Sender: TObject; var Action: TCloseAction);
- Private
- Public
- end;
- Type
- SinglyLinkedList = class
- Type PNode = ^TNode; { указатель на узел }
- TNode = record { структура узла }
- Element: Integer; { элемент }
- Index: Word; { индекс узла }
- NextNode: PNode; { ссылка на следующий }
- End;
- Private
- FHeaderNode: PNode;
- FLastNode: PNode;
- Function IsEmpty: Boolean;
- Function GetSize: Word;
- Function NodeDataWithIndex(AIndex: Word): TNode;
- Public
- Constructor Create;
- Destructor Destroy;
- Procedure Append(ANodeElement: Integer);
- Function ShowCountElementEnter(Element: Word): Word;
- Procedure Clear;
- Function PopLast: Integer;
- Procedure Remove(AIndex: Word);
- Procedure Debug;
- End;
- Var
- FormAddElement: TFormAddElement;
- List: SinglyLinkedList;
- IsDeleteble: Boolean = False;
- IsAdd: Boolean = False;
- IsEnter: Boolean = False;
- Count: Integer = 1;
- Implementation
- Uses Unit1;
- Procedure SinglyLinkedList.Debug();
- Var
- CurNode: PNode;
- Begin
- CurNode := FHeaderNode^.NextNode;
- While CurNode <> Nil do
- Begin
- ShowMessage(IntToStr(CurNode^.Element));
- CurNode := CurNode^.NextNode;
- End;
- End;
- Function SinglyLinkedList.IsEmpty: Boolean;
- Begin
- if FHeaderNode^.NextNode = Nil then
- IsEmpty := True
- else
- IsEmpty := False;
- End;
- Function SinglyLinkedList.ShowCountElementEnter(Element: Word): Word;
- Var
- Count, I: Word;
- Begin
- Count := 0;
- I := 0;
- While I < GetSize do
- Begin
- if (Element = NodeDataWithIndex(I).NextNode.Element) then
- Inc(Count);
- Inc(I);
- End;
- ShowCountElementEnter := Count;
- End;
- Function SinglyLinkedList.GetSize: Word;
- Var
- CurrentNode: TNode;
- Begin
- If IsEmpty then
- GetSize := 0
- Else
- Begin
- CurrentNode.NextNode := FHeaderNode^.NextNode;
- CurrentNode.Index := 0;
- While CurrentNode.NextNode <> Nil do
- Begin
- CurrentNode.NextNode := CurrentNode.NextNode^.NextNode;
- Inc(currentNode.Index);
- End;
- GetSize := CurrentNode.Index;
- End;
- End;
- Constructor SinglyLinkedList.Create();
- Begin
- New(FHeaderNode);
- FHeaderNode^.NextNode := Nil;
- FLastNode := FHeaderNode;
- End;
- Destructor SinglyLinkedList.Destroy;
- Begin
- Clear;
- Dispose(FHeaderNode);
- End;
- Function SinglyLinkedList.NodeDataWithIndex(AIndex: Word): TNode;
- Var
- CurrentData: TNode;
- Begin
- CurrentData.NextNode := FHeaderNode^.NextNode;
- CurrentData.Index := 0;
- While CurrentData.Index <> AIndex do
- Begin
- CurrentData.NextNode := CurrentData.NextNode^.NextNode;
- Inc(CurrentData.Index);
- End;
- NodeDataWithIndex := CurrentData;
- End;
- Procedure SinglyLinkedList.Append(ANodeElement: Integer);
- Var
- CurrentNode: PNode;
- Begin
- CurrentNode := FLastNode;
- New(CurrentNode^.NextNode);
- CurrentNode := CurrentNode^.NextNode;
- CurrentNode^.Element := ANodeElement;
- CurrentNode^.NextNode := Nil;
- FLastNode := CurrentNode;
- End;
- Procedure SinglyLinkedList.Clear;
- Begin
- While FHeaderNode^.NextNode <> Nil do
- PopLast;
- End;
- Function SinglyLinkedList.PopLast: Integer;
- Var
- I: Word;
- CurrentNode: PNode;
- Begin
- If FHeaderNode^.NextNode <> Nil then
- Begin
- CurrentNode := FHeaderNode;
- While CurrentNode^.NextNode <> FLastNode do
- CurrentNode := CurrentNode^.NextNode;
- PopLast := FLastNode^.Element;
- Dispose(CurrentNode^.NextNode);
- FLastNode := CurrentNode;
- FLastNode^.NextNode := Nil;
- End;
- End;
- Procedure SinglyLinkedList.Remove(AIndex: Word);
- Var
- CurrentData: TNode;
- BuffLastNode: PNode;
- Begin
- If AIndex = 0 then
- Begin
- CurrentData.NextNode := FHeaderNode;
- CurrentData.Index := 0;
- End
- Else
- CurrentData := NodeDataWithIndex(AIndex - 1);
- If AIndex = GetSize-1 then
- PopLast
- Else
- Begin
- BuffLastNode := FLastNode;
- FLastNode := CurrentData.NextNode^.NextNode;
- CurrentData.NextNode^.NextNode := FLastNode^.NextNode;
- FLastNode := BuffLastNode;
- End;
- End;
- {$R *.dfm}
- Function IsElementCorrect(EditAdd:TEdit):Boolean;
- Var
- IsCorrect: Boolean;
- Begin
- IsCorrect := True;
- Try
- StrToInt(EditAdd.Text)
- Except
- IsCorrect := False;
- End;
- IsElementCorrect := IsCorrect;
- End;
- Procedure TFormAddElement.ButtonOKClick(Sender: TObject);
- Var
- Element: Integer;
- Begin
- If IsAdd then
- Begin
- If count = 1 then
- Begin
- List := SinglyLinkedList.Create();
- IsDeleteble := True;
- End;
- If IsElementCorrect(EditAdd) then
- Begin
- Element := StrToInt(EditAdd.Text);
- ListForm.StringGrid1.Cells[1,count] := EditAdd.Text;
- ListForm.StringGrid1.Cells[0,count] := IntToStr(Count);
- ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
- List.Append(Element);
- Inc(Count);
- EditAdd.Text := '';
- IsAdd := False;
- FormAddElement.Close;
- End
- Else
- MessageDlg('Введите целое число в пределах +- 2*10^9!', mtError, [mbOK], 0)
- End;
- If IsEnter then
- Begin
- If IsElementCorrect(EditAdd) then
- Begin
- Element := StrToInt(EditAdd.Text);
- ShowMessage(IntToStr(List.ShowCountElementEnter(Element)));
- IsEnter := False;
- FormAddElement.Close;
- End;
- End;
- End;
- Procedure TFormAddElement.FormClose(Sender: TObject; var Action: TCloseAction);
- Begin
- IsEnter := False;
- IsAdd := False;
- EditAdd.Text := '';
- End;
- End.
- Unit Unit3;
- Interface
- Uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
- Type
- TMainMenu = class(TForm)
- Label1: TLabel;
- ButtonOpenFile: TButton;
- ButtonCreateNewFile: TButton;
- OpenDialog: TOpenDialog;
- Procedure ButtonCreateNewFileClick(Sender: TObject);
- Procedure ButtonOpenFileClick(Sender: TObject);
- Private
- Public
- End;
- Var
- MainMenu: TMainMenu;
- Implementation
- Uses Unit1, Unit2;
- {$R *.dfm}
- Function IsFileCorrect(var UserFile:TextFile):Boolean;
- Var
- Number:Integer;
- IsCorrect: Boolean;
- Begin
- IsCorrect := True;
- Reset(UserFile);
- While Not(eof(UserFile)) and IsCorrect do
- While not(eoln(UserFile)) and IsCorrect do
- Try
- Read(UserFile, Number);
- Except
- IsCorrect := False;
- End;
- CloseFile(UserFile);
- IsFileCorrect := IsCorrect;
- End;
- Procedure TMainMenu.ButtonOpenFileClick(Sender: TObject);
- Var
- UserFile:TextFile;
- Number: Integer;
- Begin
- If OpenDialog.Execute then
- Begin
- AssignFile(UserFile, OpenDialog.FileName);
- if IsFileCorrect(UserFile) then
- Begin
- ListForm.Show;
- MainMenu.Visible := False;
- Reset(UserFile);
- List := SinglyLinkedList.Create();
- IsDeleteble := True;
- ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
- While Not(eof(UserFile)) do
- While not(eoln(UserFile)) do
- Begin
- Read(UserFile, Number);
- ListForm.StringGrid1.Cells[1,count] := IntToStr(Number);
- ListForm.StringGrid1.Cells[0,count] := IntToStr(Count);
- ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
- List.Append(Number);
- Inc(Count);
- End;
- ListForm.SaveFileButton.Enabled := True;
- ListForm.AllEntryButton.Enabled := True;
- ListForm.DeleteRowButton.Enabled := True;
- ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount - 1;
- IsAdd := False;
- CloseFile(UserFile);
- End
- Else
- MessageDlg('Проверьте данные в файле! Это должны быть числа в диапазоне +-2*10^9!', mtError, [mbOK], 0)
- End;
- End;
- Procedure TMainMenu.ButtonCreateNewFileClick(Sender: TObject);
- Begin
- ListForm.Show;
- MainMenu.Visible := False;
- End;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement