Advertisement
THOMAS_SHELBY_18

Lab5_1 DELPHI

Mar 4th, 2024
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 15.59 KB | Source Code | 0 0
  1. unit ListUnit;
  2.  
  3. interface
  4. type
  5.     TElemPointer = ^TElem;
  6.     TElem = record
  7.         Value: Integer;
  8.         Next: TElemPointer;
  9.     end;
  10.  
  11. procedure InsertElement(Head: TElemPointer; NewValue: Integer);
  12. function MergeLists(FirstHeader, SecondHeader: TElemPointer): TElemPointer;
  13. function InitializeList(): TElemPointer;
  14. procedure DisposeList (Header: TElemPointer);
  15. procedure OutputListToTextFile (Header: TElemPointer; var FileOut: TextFile);
  16.  
  17. implementation
  18.  
  19. procedure InsertElement(Head: TElemPointer; NewValue: Integer);
  20. var
  21.     Curr, Temp: TElemPointer;
  22. begin
  23.     Curr := Head;
  24.     while (Curr^.Next <> nil) and (Curr^.Next^.Value <= NewValue) do
  25.         Curr := Curr^.Next;
  26.  
  27.     New(Temp);
  28.     Temp^.Next := Curr^.Next;
  29.     Curr^.Next := Temp;
  30.     Temp^.Value := NewValue;
  31. end;
  32.  
  33. procedure InsertElementForMerge(var Curr: TElemPointer; NewValue: Integer);
  34. var
  35.     Temp: TElemPointer;
  36. begin
  37.     while (Curr^.Next <> nil) and (Curr^.Next^.Value <= NewValue) do
  38.         Curr := Curr^.Next;
  39.  
  40.     if Curr^.Value <> NewValue then
  41.     begin
  42.         New(Temp);
  43.         Temp^.Next := Curr^.Next;
  44.         Curr^.Next := Temp;
  45.  
  46.         Temp^.Value := NewValue;
  47.     end;
  48. end;
  49.  
  50. function InitializeList(): TElemPointer;
  51. var
  52.     Header: TElemPointer;
  53. begin
  54.     New(Header);
  55.     Header^.Next := nil;
  56.     Header^.Value := High(Integer);
  57.  
  58.     InitializeList := Header;
  59. end;
  60.  
  61. function MergeLists(FirstHeader, SecondHeader: TElemPointer): TElemPointer;
  62. var
  63.     Temp, Curr, ResultHeader: TElemPointer;
  64. begin
  65.     ResultHeader := InitializeList();
  66.  
  67.     Temp := FirstHeader;
  68.     Curr := ResultHeader;
  69.     while Temp^.Next <> nil do
  70.     begin
  71.         Temp := Temp^.Next;
  72.         InsertElementForMerge(Curr, Temp^.Value);
  73.     end;
  74.  
  75.     Temp := SecondHeader;
  76.     Curr := ResultHeader;
  77.     while Temp^.Next <> nil do
  78.     begin
  79.         Temp := Temp^.Next;
  80.         InsertElementForMerge(Curr, Temp^.Value);
  81.     end;
  82.  
  83.     MergeLists := ResultHeader;
  84. end;
  85.  
  86. procedure DisposeList (Header: TElemPointer);
  87. var
  88.     Curr, Temp: TElemPointer;
  89. begin
  90.     if Header^.Next <> nil then
  91.     begin
  92.         Curr := Header^.Next;
  93.  
  94.         while Curr^.Next <> nil do
  95.         begin
  96.             Temp := Curr^.Next;
  97.             Dispose(Curr);
  98.             Curr := Temp;
  99.         end;
  100.         Dispose(Curr);
  101.         Header^.Next := nil;
  102.     end;
  103. end;
  104.  
  105. procedure OutputListToTextFile (Header: TElemPointer; var FileOut: TextFile);
  106. var
  107.     Curr: TElemPointer;
  108. begin
  109.     Curr := Header;
  110.  
  111.     Rewrite(FileOut);
  112.     while Curr^.Next <> nil do
  113.     begin
  114.         Curr := Curr^.Next;
  115.         Writeln(FileOut, Curr^.Value);
  116.     end;
  117.     CloseFile(FileOut);
  118. end;
  119. end.
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133. unit MainUnit;
  134.  
  135. interface
  136.  
  137. uses
  138.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  139.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.Grids, Clipbrd;
  140.  
  141. type
  142.   TMainForm = class(TForm)
  143.     MainMenu: TMainMenu;
  144.     FileMenuItem: TMenuItem;
  145.     OpenMenuItem: TMenuItem;
  146.     SaveMenuItem: TMenuItem;
  147.     SaveAsMenuItem: TMenuItem;
  148.     ManualMenuItem: TMenuItem;
  149.     AboutDeveloperMenuItem: TMenuItem;
  150.     OpenDialog: TOpenDialog;
  151.     SaveDialog: TSaveDialog;
  152.     CopyPastePopupMenu: TPopupMenu;
  153.     CopyButton: TMenuItem;
  154.     PasteButton: TMenuItem;
  155.     CutButton: TMenuItem;
  156.     FirstListGrid: TStringGrid;
  157.     AddToFirstListButton: TButton;
  158.     FirstListEdit: TEdit;
  159.     SecondListGrid: TStringGrid;
  160.     AddToSecondListButton: TButton;
  161.     SecondListEdit: TEdit;
  162.     ResultListGrid: TStringGrid;
  163.     MergeButton: TButton;
  164.     ConditionLabel: TLabel;
  165.     ResetButton: TButton;
  166.     ExitButton: TButton;
  167.     procedure AboutDeveloperMenuItemClick(Sender: TObject);
  168.     procedure ManualMenuItemClick(Sender: TObject);
  169.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  170.     procedure OpenMenuItemClick(Sender: TObject);
  171.     procedure SaveMenuItemClick(Sender: TObject);
  172.     procedure SaveAsMenuItemClick(Sender: TObject);
  173.     procedure FormCreate(Sender: TObject);
  174.     procedure AddToFirstListButtonClick(Sender: TObject);
  175.     procedure AddToSecondListButtonClick(Sender: TObject);
  176.     procedure MergeButtonClick(Sender: TObject);
  177.     procedure ResetButtonClick(Sender: TObject);
  178.     procedure EditKeyPress(Sender: TObject; var Key: Char);
  179.     procedure CopyButtonClick(Sender: TObject);
  180.     procedure PasteButtonClick(Sender: TObject);
  181.     procedure CutButtonClick(Sender: TObject);
  182.     procedure CopyPastePopupMenuPopup(Sender: TObject);
  183.     procedure ExitButtonClick(Sender: TObject);
  184.     procedure EditDblClick(Sender: TObject);
  185.     procedure EditKeyDown(Sender: TObject; var Key: Word;
  186.       Shift: TShiftState);
  187.     procedure EditChange(Sender: TObject);
  188.   private
  189.     { Private declarations }
  190.   public
  191.     { Public declarations }
  192.   end;
  193.  
  194. var
  195.     MainForm: TMainForm;
  196.  
  197. implementation
  198. uses
  199.     ListUnit;
  200.  
  201. const
  202.     kMINUS = #45;
  203.     kBACKSPACE = #8;
  204.     kINSERT = 45;
  205.     MAX = 9999999;
  206.     MIN = -999999;
  207.  
  208. var
  209.     FirstListHeader, SecondListHeader, ResultListHeader: TElemPointer;
  210.  
  211. {$R *.dfm}
  212.  
  213. procedure TMainForm.AboutDeveloperMenuItemClick(Sender: TObject);
  214. begin
  215.     MessageBox(Handle, 'Разработчик: Наривончик Александр Михайлович, гр. 351004', 'О разработчике', MB_OK Or MB_ICONINFORMATION);
  216. end;
  217.  
  218. procedure TMainForm.ManualMenuItemClick(Sender: TObject);
  219. begin
  220.     MessageBox(Handle, '1. Заполните оба списка целочисленными значениями от -999999 до 9999999' + #13#10 + '2. Нажмите кнопку "Выполнить слияние".' + #13#10 + '3. Получите результат!'+ #13#10 + '4. В случае ввода из файла убедитесь, что файл содержит элементы (числа от -999999 до 9999999) первого списка записанные в отдельных строках, затем символ "-" в новой строке, а затем элементы второго списка.', 'Инструкция', MB_OK Or MB_ICONINFORMATION);
  221. end;
  222.  
  223. procedure OutputNewValueToGrid(NewValue: String; Grid: TStringGrid);
  224. begin
  225.     with Grid do
  226.     begin
  227.         if Cells[0, 1].IsEmpty then
  228.             Cells[0, 1] := NewValue
  229.         else
  230.         begin
  231.             RowCount := RowCount + 1;
  232.             Cells[0, RowCount - 1] := NewValue;
  233.         end;
  234.     end;
  235. end;
  236.  
  237. procedure OutputList (Header: TElemPointer; Grid: TStringGrid);
  238. var
  239.     Curr: TElemPointer;
  240. begin
  241.     Curr := Header;
  242.  
  243.     while Curr^.Next <> nil do
  244.     begin
  245.         Curr := Curr^.Next;
  246.         OutputNewValueToGrid(IntToStr(Curr^.Value), Grid);
  247.     end;
  248. end;
  249.  
  250. procedure ClearStringGrid (Grid: TStringGrid);
  251. var
  252.     I: Integer;
  253. begin
  254.     with Grid do
  255.     begin
  256.         for I := RowCount-1 DownTo 1 do
  257.             Cells[0, I] := '';
  258.         RowCount := 2;
  259.     end;
  260. end;
  261.  
  262. procedure TMainForm.AddToFirstListButtonClick(Sender: TObject);
  263. begin
  264.     InsertElement(FirstListHeader, StrToInt(FirstListEdit.Text));
  265.     ClearStringGrid(FirstListGrid);
  266.     OutputList(FirstListHeader, FirstListGrid);
  267.  
  268.     FirstListEdit.Text := '';
  269. end;
  270.  
  271. procedure TMainForm.AddToSecondListButtonClick(Sender: TObject);
  272. begin
  273.     InsertElement(SecondListHeader, StrToInt(SecondListEdit.Text));
  274.     ClearStringGrid(SecondListGrid);
  275.     OutputList(SecondListHeader, SecondListGrid);
  276.  
  277.     SecondListEdit.Text := '';
  278. end;
  279.  
  280. procedure TMainForm.CopyButtonClick(Sender: TObject);
  281. begin
  282.     TEdit(ActiveControl).CopyToClipboard;
  283. end;
  284.  
  285. procedure TMainForm.CopyPastePopupMenuPopup(Sender: TObject);
  286. var
  287.     IValue: Integer;
  288.     Buffer: String;
  289. begin
  290.     Buffer := Clipboard.AsText;
  291.     PasteButton.Enabled := True;
  292.     PasteButton.Enabled := TryStrToInt(Buffer, IValue)
  293. end;
  294.  
  295. procedure TMainForm.CutButtonClick(Sender: TObject);
  296. begin
  297.     TEdit(ActiveControl).CutToClipboard;
  298. end;
  299.  
  300. procedure TMainForm.PasteButtonClick(Sender: TObject);
  301. begin
  302.      TEdit(ActiveControl).PasteFromClipboard;
  303. end;
  304.  
  305. procedure TMainForm.EditKeyPress(Sender: TObject; var Key: Char);
  306. begin
  307.     if Not (Key in ['0'..'9', kBACKSPACE, kMINUS]) then
  308.         Key := #0;
  309. end;
  310.  
  311. procedure TMainForm.ExitButtonClick(Sender: TObject);
  312. begin
  313.     MainForm.Close;
  314. end;
  315.  
  316. procedure TMainForm.EditDblClick(Sender: TObject);
  317. begin
  318.     TEdit(ActiveControl).Text := '';
  319. end;
  320.  
  321. procedure TMainForm.EditKeyDown(Sender: TObject; var Key: Word;
  322.   Shift: TShiftState);
  323. begin
  324.     if Key = kINSERT then
  325.         Key := 0;
  326. end;
  327.  
  328. procedure EditAddButtonEnabled(ActiveEdit: TEdit);
  329. begin
  330.     with ActiveEdit do
  331.     begin
  332.     if Name = 'FirstListEdit' then
  333.         MainForm.AddToFirstListButton.Enabled := not ((Text = '') or (Text = '-'))
  334.     else
  335.         if Name = 'SecondListEdit' then
  336.             MainForm.AddToSecondListButton.Enabled := not ((Text = '') or (Text = '-'));
  337.     end;
  338. end;
  339.  
  340. procedure TMainForm.EditChange(Sender: TObject);
  341. var
  342.     CursPos: Byte;
  343.     TempStr: String;
  344.     IValue: Integer;
  345. begin
  346.     with TEdit(Sender) do
  347.     begin
  348.         if (Length(Text) > 0) And (Text <> '-') then
  349.         begin
  350.             CursPos := SelStart;
  351.             TempStr := Text;
  352.  
  353.             if not TryStrToInt(TempStr, IValue) then
  354.             begin
  355.                 Delete (TempStr, SelStart, 1);
  356.                 Text := TempStr;
  357.                 SelStart := CursPos-1;
  358.             end
  359.             else
  360.             begin
  361.                 Text := IntToStr(IValue);
  362.                 SelStart := CursPos;
  363.             end;
  364.         end;
  365.     end;
  366.  
  367.     EditAddButtonEnabled(TEdit(Sender));
  368. end;
  369.  
  370. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  371. begin
  372.     CanClose := MessageBox(Handle, 'Вы действительно хотите выйти?', 'Вы уверены?', MB_YESNO Or MB_ICONQUESTION) = IDYES;
  373. end;
  374.  
  375. procedure TMainForm.FormCreate(Sender: TObject);
  376. begin
  377.     FirstListGrid.Cells[0, 0] := 'Первый список';
  378.     SecondListGrid.Cells[0, 0] := 'Второй список';
  379.     ResultListGrid.Cells[0, 0] := 'Результат';
  380.  
  381.     FirstListHeader := InitializeList();
  382.     SecondListHeader := InitializeList();
  383.     ResultListHeader := InitializeList();
  384. end;
  385.  
  386. procedure TMainForm.MergeButtonClick(Sender: TObject);
  387. begin
  388.     ClearStringGrid(ResultListGrid);
  389.     ResultListHeader := MergeLists(FirstListHeader, SecondListHeader);
  390.     OutputList(ResultListHeader, ResultListGrid);
  391.  
  392.     SaveAsMenuItem.Enabled := True;
  393.     SaveMenuItem.Enabled := True;
  394. end;
  395.  
  396. function ReadNumFromFile(var FileIn: TextFile): Integer;
  397. var
  398.     IsFileCorrect: Boolean;
  399.     NumStr: String;
  400.     Code: Integer;
  401.     Num: Integer;
  402.  
  403. begin
  404.     Readln(FileIn, NumStr);
  405.  
  406.     if NumStr = '-' then
  407.         ReadNumFromFile := -1
  408.     else
  409.     begin
  410.         Val(NumStr, Num, Code);
  411.  
  412.         if Code = 0 then
  413.             IsFileCorrect := True
  414.         else
  415.         begin
  416.             MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK Or MB_ICONERROR);
  417.             IsFileCorrect := False;
  418.         end;
  419.  
  420.         if (IsFileCorrect) and ((Num < MIN) or (Num > MAX)) then
  421.         begin
  422.             MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK Or MB_ICONERROR);
  423.             IsFileCorrect := False;
  424.         end;
  425.  
  426.         if IsFileCorrect then
  427.             ReadNumFromFile := 1
  428.         else
  429.             ReadNumFromFile := 0
  430.     end;
  431. end;
  432.  
  433. function CheckFile(var FileIn: TextFile): Boolean;
  434. var
  435.     IsFileCorrect: Boolean;
  436.     Code: Integer;
  437. begin
  438.     IsFileCorrect := True;
  439.  
  440.     repeat
  441.         Code := ReadNumFromFile(FileIn);
  442.  
  443.         case Code of
  444.             -1:;
  445.             0:IsFileCorrect := False;
  446.             1:IsFileCorrect := True;
  447.         end;
  448.     until not isFileCorrect or (Code = -1) or EoF(FileIn);
  449.  
  450.     if isFileCorrect and not Eof(FileIn) then
  451.     begin
  452.         repeat
  453.             Code := ReadNumFromFile(FileIn);
  454.  
  455.             if Code = -1 then
  456.             begin
  457.                 IsFileCorrect := False;
  458.                 MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK Or MB_ICONERROR);
  459.             end
  460.             else
  461.                 if Code = 1 then
  462.                     IsFileCorrect := True
  463.                 else
  464.                     IsFileCorrect := False;
  465.  
  466.         until not IsFileCorrect or EoF(FileIn);
  467.  
  468.     end;
  469.     CheckFile := IsFileCorrect;
  470. end;
  471.  
  472. procedure ResetProgram();
  473. begin
  474.     with MainForm do
  475.     begin
  476.         ClearStringGrid(ResultListGrid);
  477.         ClearStringGrid(FirstListGrid);
  478.         ClearStringGrid(SecondListGrid);
  479.  
  480.         DisposeList(ResultListHeader);
  481.         DisposeList(FirstListHeader);
  482.         DisposeList(SecondListHeader);
  483.  
  484.         FirstListEdit.Text := '';
  485.         SecondListEdit.Text := '';
  486.  
  487.         SaveAsMenuItem.Enabled := False;
  488.         SaveMenuItem.Enabled := False;
  489.     end;
  490. end;
  491.  
  492. procedure TMainForm.OpenMenuItemClick(Sender: TObject);
  493. var
  494.     FileIn: TextFile;
  495.     Path, Value: String;
  496.     IsFileCorrect: Boolean;
  497. begin
  498.     If OpenDialog.Execute Then
  499.     Begin
  500.  
  501.         ResetProgram;
  502.  
  503.         IsFileCorrect := True;
  504.         Path := OpenDialog.FileName;
  505.         AssignFile(FileIn, Path);
  506.  
  507.         Try
  508.             Reset(FileIn);
  509.         Except
  510.             IsFileCorrect := False;
  511.             MessageBox(Handle, 'Не удалось открыть файл!', 'Ошибка', MB_OK Or MB_ICONERROR);
  512.         End;
  513.  
  514.         if IsFileCorrect then
  515.         begin
  516.             IsFileCorrect := CheckFile(FileIn);
  517.             CloseFile(FileIn);
  518.         end;
  519.  
  520.         If IsFileCorrect Then
  521.         Begin
  522.             Reset(FileIn);
  523.  
  524.             repeat
  525.                 Readln(FileIn, Value);
  526.                 if Value <> '-' then
  527.                     InsertElement(FirstListHeader, StrToInt(Value));
  528.             until (Value = '-') or EoF(FileIn);
  529.  
  530.             if (Value = '-') and not EoF(FileIn) then
  531.             begin
  532.                 repeat
  533.                     Readln(FileIn, Value);
  534.                     InsertElement(SecondListHeader, StrToInt(Value));
  535.                 until EoF(FileIn);
  536.             end;
  537.  
  538.             CloseFile(FileIn);
  539.  
  540.             OutputList(FirstListHeader, FirstListGrid);
  541.             OutputList(SecondListHeader, SecondListGrid);
  542.         End;
  543.     End;
  544. end;
  545.  
  546. procedure TMainForm.ResetButtonClick(Sender: TObject);
  547. begin
  548.     ResetProgram;
  549. end;
  550.  
  551. Procedure SaveAnswer ();
  552. var
  553.     IsFileCorrect: Boolean;
  554.     FileOut: TextFile;
  555.     Path: String;
  556. Begin
  557.     With MainForm Do
  558.     Begin
  559.         IsFileCorrect := True;
  560.         Path := SaveDialog.FileName;
  561.         AssignFile(FileOut, Path);
  562.         Try
  563.             Rewrite(FileOut);
  564.         Except
  565.             IsFileCorrect := False;
  566.             MessageBox(Handle, 'Не удалось сохранить ответ в файл!', 'Ошибка', MB_OK Or MB_ICONERROR);
  567.         End;
  568.  
  569.         If IsFileCorrect then
  570.         Begin
  571.             CloseFile(FileOut);
  572.             OutputListToTextFile(ResultListHeader, FileOut);
  573.             MessageBox(Handle, 'Сохранено успешно!', 'Сохранение', MB_OK Or MB_ICONINFORMATION);
  574.         End;
  575.     End;
  576. End;
  577.  
  578. procedure TMainForm.SaveAsMenuItemClick(Sender: TObject);
  579. begin
  580.     If SaveDialog.Execute Then
  581.         SaveAnswer();
  582. end;
  583.  
  584. procedure TMainForm.SaveMenuItemClick(Sender: TObject);
  585. begin
  586.     If(SaveDialog.FileName = 'Answer') Then
  587.     Begin
  588.         If SaveDialog.Execute Then
  589.             SaveAnswer();
  590.     End
  591.     Else
  592.         SaveAnswer();
  593. end;
  594.  
  595. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement