Advertisement
gguuppyy

lab44izm

Mar 30th, 2024 (edited)
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.47 KB | None | 0 0
  1. Unit Main;
  2.  
  3. Interface
  4.  
  5. Uses
  6.     Winapi.Windows,
  7.     Winapi.Messages,
  8.     System.SysUtils,
  9.     System.Variants,
  10.     System.Classes,
  11.     Vcl.Graphics,
  12.     Clipbrd,
  13.     Vcl.Controls,
  14.     Vcl.Forms,
  15.     Vcl.Dialogs,
  16.     Vcl.StdCtrls,
  17.     Vcl.Menus,
  18.     Vcl.ExtCtrls,
  19.     Vcl.Imaging.Pngimage;
  20.  
  21. Type
  22.     TMainForm = Class(TForm)
  23.         ResButton: TButton;
  24.         DiskNumber: TEdit;
  25.         MainMenu1: TMainMenu;
  26.         N1: TMenuItem;
  27.         N2: TMenuItem;
  28.         N3: TMenuItem;
  29.         N4: TMenuItem;
  30.         N5: TMenuItem;
  31.         Y1: TLabel;
  32.         Disk: TLabel;
  33.         BalloonHint1: TBalloonHint;
  34.         OpenDialog1: TOpenDialog;
  35.         SaveDialog1: TSaveDialog;
  36.         Output: TMemo;
  37.         LabelTask: TLabel;
  38.         Procedure ResButtonClick(Sender: TObject);
  39.         Procedure N2Click(Sender: TObject);
  40.         Procedure N5Click(Sender: TObject);
  41.         Procedure DiskNumberKeyPress(Sender: TObject; Var Key: Char);
  42.         Procedure N3Click(Sender: TObject);
  43.         Procedure GetPath(Var Path: String);
  44.         Procedure N4Click(Sender: TObject);
  45.         Procedure Checker(Var IsCorrect: Boolean);
  46.         Procedure N1Click(Sender: TObject);
  47.         Procedure DiskNumberChange(Sender: TObject);
  48.         Procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  49.         Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  50.         Procedure DiskNumberContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
  51.  
  52.     Private
  53.         { Private declarations }
  54.     Public
  55.         { Public declarations }
  56.     End;
  57.  
  58. Const
  59.     E: Double = 1.0E-3;
  60.     NumSet = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #8, #44, #45, #46];
  61.  
  62. Var
  63.     MainForm: TMainForm;
  64.  
  65. Implementation
  66.  
  67. {$R *.dfm}
  68.  
  69. Uses
  70.     Instruction,
  71.     Information;
  72.  
  73. Procedure TmainForm.Checker(Var IsCorrect: Boolean);
  74.  
  75. Begin
  76.     IsCorrect := True;
  77.  
  78.     Try
  79.         StrtoFloat(DiskNumber.Text);
  80.     Except
  81.         IsCorrect := False;
  82.     End;
  83.  
  84. End;
  85.  
  86. { procedure SolveTowerOfHanoi(n: Integer; source, destination, auxiliary: Char; Output: TStrings);
  87.   begin
  88.   if n > 0 then
  89.   begin
  90.   SolveTowerOfHanoi(n - 1, source, auxiliary, destination, Output);
  91.   Output.Add('??????????? ???? ' + IntToStr(n) + ' ? ' + source + ' ?? ' + destination);
  92.   SolveTowerOfHanoi(n - 1, auxiliary, destination, source, Output);
  93.   end;
  94.   end;
  95.  
  96.   procedure TMainForm.ResButtonClick(Sender: TObject);
  97.   var
  98.   NumDisks: Integer;
  99.   IsCorrect: Boolean;
  100.   begin
  101.   Checker(IsCorrect);
  102.   if IsCorrect then
  103.   begin
  104.   NumDisks := StrToInt(DiskNumber.Text);
  105.   Output.Lines.Clear;
  106.   SolveTowerOfHanoi(NumDisks, 'A', 'B', 'R', Output.Lines);
  107.   Output.Lines.Add('??????????? ??????.');
  108.   end
  109.   else
  110.   begin
  111.   ShowMessage('????????? ??? ????');
  112.   Exit;
  113.   end;
  114.   end; }
  115.  
  116. Procedure SolveTowerOfHanoi(N, Source, Destination, Auxiliary: Integer; Output: TMemo);
  117. Var
  118.     TextToAdd: String;
  119. Begin
  120.     If N > 0 Then
  121.     Begin
  122.         SolveTowerOfHanoi(N - 1, Source, Auxiliary, Destination, Output);
  123.         TextToAdd := 'Переместить диск ' + IntToStr(N) + ' с ' + IntToStr(Source) + ' на ' + IntToStr(Destination);
  124.         Output.Lines.Add(TextToAdd);
  125.         SolveTowerOfHanoi(N - 1, Auxiliary, Destination, Source, Output);
  126.     End;
  127. End;
  128.  
  129. Procedure TMainForm.ResButtonClick(Sender: TObject);
  130. Var
  131.     NumDisks: Integer;
  132.     Source, Destination, Auxiliary: Integer;
  133.     IsCorrect: Boolean;
  134. Begin
  135.     NumDisks := StrToInt(DiskNumber.Text);
  136.     Source := 1;
  137.     Destination := 3;
  138.     Auxiliary := 2;
  139.     Checker(IsCorrect);
  140.     If IsCorrect Then
  141.     Begin
  142.         Output.Lines.Clear;
  143.         SolveTowerOfHanoi(NumDisks, Source, Destination, Auxiliary, Output);
  144.         Output.Lines.Add('Головоломка решена.');
  145.     End
  146.     Else
  147.     Begin
  148.         ShowMessage('Заполните все поля.');
  149.     End;
  150. End;
  151.  
  152. { procedure ShowProcess(NumDisks, Source, Destination, Auxiliary: Integer; OutputMemo: TMemo; Sender: TObject);
  153.   var
  154.   IsCorrect: Boolean;
  155.   DiskNumber: Integer;
  156.   begin
  157.   Checker(IsCorrect);
  158.   if IsCorrect then
  159.   begin
  160.   NumDisks := StrToInt(DiskNumber.Text);
  161.   Output.Lines.Clear;
  162.   OutputMemo.Lines.Add('??? ' + IntToStr(StepProc) + ':');
  163.   for I := 0 to High(Arr) do
  164.   begin
  165.   for J := 0 to High(Arr[I]) do
  166.   begin
  167.   TextToAdd := '';
  168.   for K := 0 to High(Arr[I][J]) do
  169.   TextToAdd := TextToAdd + IntToStr(Arr[I][J][K]) + ' ';
  170.   OutputMemo.Lines.Add(TextToAdd);
  171.   end;
  172.   ResultMemo.Lines.Add('');
  173.   end;
  174.   end; }
  175.  
  176. Procedure TMainForm.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  177. Var
  178.     Confirmation: Integer;
  179. Begin
  180.     Confirmation := Application.MessageBox('Вы действительно хотите выйти?', 'Выход', MB_YESNO);
  181.     CanClose := Confirmation = IDYES;
  182. End;
  183.  
  184. Procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  185. Begin
  186.     If (DiskNumber.Text <> '') Then
  187.         ResButton.Enabled := True
  188.     Else
  189.         ResButton.Enabled := False;
  190. End;
  191.  
  192. Procedure TMainForm.DiskNumberChange(Sender: TObject);
  193. Var
  194.     Value: Double;
  195. Begin
  196.     If TryStrToFloat(DiskNumber.Text, Value) Then
  197.     Begin
  198.         If (Value < 1) Then
  199.         Begin
  200.             BalloonHint1.Title := 'Неверное значение.';
  201.             BalloonHint1.Description := 'N должно быть больше 0.';
  202.             BalloonHint1.ImageIndex := 1;
  203.             BalloonHint1.ShowHint(DiskNumber);
  204.             DiskNumber.Text := '';
  205.         End;
  206.     End;
  207.     DiskNumber.MaxLength := 5;
  208.     If Length(DiskNumber.Text) = 0 Then
  209.     Begin
  210.         Output.Lines.Clear;
  211.     End;
  212. End;
  213.  
  214. Procedure TMainForm.DiskNumberContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
  215. Begin
  216.     Handled := True;
  217. End;
  218.  
  219. Procedure TMainForm.DiskNumberKeyPress(Sender: TObject; Var Key: Char);
  220. Begin
  221.  
  222.     If Key In NumSet Then
  223.     Begin
  224.         If Key = '0' Then
  225.         Begin
  226.             If Length(DiskNumber.Text) = 1 Then
  227.             Begin
  228.                 If DiskNumber.Text[1] In ['0'] Then
  229.                 Begin
  230.                     Key := #0;
  231.                 End;
  232.             End;
  233.             If Length(DiskNumber.Text) = 2 Then
  234.             Begin
  235.                 If (DiskNumber.Text[1] = '-') AND (DiskNumber.Text[2] = '0') Then
  236.                 Begin
  237.                     Key := #0;
  238.                 End;
  239.             End;
  240.         End;
  241.  
  242.         If Key = #45 Then
  243.         Begin
  244.             If Length(DiskNumber.Text) > 0 Then
  245.             Begin
  246.                 BalloonHint1.Title := 'Недопустимый символ.';
  247.                 BalloonHint1.Description := 'Здесь можно ввести только число.';
  248.                 BalloonHint1.ImageIndex := 1;
  249.                 BalloonHint1.ShowHint(DiskNumber);
  250.                 Key := #0;
  251.             End;
  252.         End;
  253.  
  254.         If Key In [',', '.'] Then
  255.         Begin
  256.             Key := FormatSettings.DecimalSeparator;
  257.             If Pos(Key, DiskNumber.Text) <> 0 Then
  258.             Begin
  259.                 BalloonHint1.Title := 'Недопустимый символ.';
  260.                 BalloonHint1.Description := 'Здесь можно ввести только число.';
  261.                 BalloonHint1.ImageIndex := 1;
  262.                 BalloonHint1.ShowHint(DiskNumber);
  263.                 Key := #0;
  264.             End
  265.             Else
  266.                 If Length(DiskNumber.Text) > 0 Then
  267.                 Begin
  268.                     If (DiskNumber.Text[1] = '-') AND (Length(DiskNumber.Text) = 1) Then
  269.                     Begin
  270.                         Key := #0;
  271.                     End
  272.                 End
  273.                 Else
  274.                     If DiskNumber.SelStart = 0 Then
  275.                     Begin
  276.                         DiskNumber.Text := '0' + DiskNumber.Text;
  277.                         DiskNumber.SelStart := 1;
  278.                     End;
  279.         End;
  280.     End
  281.     Else
  282.     Begin
  283.         BalloonHint1.Title := 'Недопустимый символ.';
  284.         BalloonHint1.Description := 'Здесь можно ввести только число.';
  285.         BalloonHint1.ShowHint(DiskNumber);
  286.         Key := #0;
  287.     End;
  288. End;
  289.  
  290. Procedure TMainForm.N1Click(Sender: TObject);
  291. Begin
  292.     If Output.Lines.Count = 0 Then
  293.     Begin
  294.         N4.Enabled := False;
  295.     End
  296.     Else
  297.     Begin
  298.         N4.Enabled := True;
  299.     End;
  300. End;
  301.  
  302. Procedure TMainForm.N2Click(Sender: TObject);
  303. Begin
  304.     InstructionForm.ShowModal;
  305. End;
  306.  
  307. Procedure TMainForm.GetPath(Var Path: String);
  308. Begin
  309.     If OpenDialog1.Execute Then
  310.     Begin
  311.         Path := OpenDialog1.FileName;
  312.     End
  313.     Else
  314.     Begin
  315.         ShowMessage('Открытие файла отменено!');
  316.     End;
  317. End;
  318.  
  319. procedure TMainForm.N3Click(Sender: TObject);
  320. var
  321.   IsCorrect, Fail: Boolean;
  322.   Path, Number, Str: String;
  323.   Count: Integer;
  324.   FileElem: TextFile;
  325. begin
  326.   GetPath(Path);
  327.  
  328.   AssignFile(FileElem, Path);
  329.   Fail := False;
  330.   IsCorrect := True;
  331.   Count := 0;
  332.  
  333.   if not FileExists(Path) then
  334.   begin
  335.     ShowMessage('Файл не найден!');
  336.   end
  337.   else
  338.   begin
  339.     try
  340.       try
  341.         Reset(FileElem);
  342.       except
  343.         CloseFile(FileElem);
  344.         IsCorrect := False;
  345.         ShowMessage('Ошибка открытия файла.');
  346.       end;
  347.  
  348.       if IsCorrect then
  349.       begin
  350.         while not Eof(FileElem) do
  351.         begin
  352.           ReadLn(FileElem, Str);
  353.           Inc(Count);
  354.         end;
  355.  
  356.         CloseFile(FileElem);
  357.         if Count <> 1 then
  358.           Fail := True;
  359.       end;
  360.  
  361.       if IsCorrect then
  362.       begin
  363.         Reset(FileElem);
  364.  
  365.         try
  366.           Readln(FileElem, Number);
  367.           if not TryStrToInt(Number, Count) then
  368.             Fail := True;
  369.         except
  370.           Fail := True;
  371.         end;
  372.       end;
  373.     finally
  374.       CloseFile(FileElem);
  375.       if Fail then
  376.         ShowMessage('Проверьте введенные данные и повторите попытку!')
  377.       else
  378.       begin
  379.         DiskNumber.Text := Number;
  380.       end;
  381.       ShowMessage('Обработка завершена.');
  382.     end;
  383.   end;
  384. end;
  385.  
  386. Procedure TMainForm.N4Click(Sender: TObject);
  387. Begin
  388.  
  389.     If SaveDialog1.Execute Then
  390.     Begin
  391.  
  392.         Output.Lines.SaveToFile(SaveDialog1.FileName);
  393.     End
  394.     Else
  395.  
  396.     Begin
  397.         ShowMessage('Сохранение в файл отменено.');
  398.     End;
  399.  
  400. End;
  401.  
  402. Procedure TMainForm.N5Click(Sender: TObject);
  403. Begin
  404.     InformationForm.ShowModal;
  405. End;
  406.  
  407. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement