Advertisement
gguuppyy

lab44

Mar 28th, 2024
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.68 KB | Source Code | 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.  
  117.  
  118. Procedure TMainForm.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  119. Var
  120.     Confirmation: Integer;
  121. Begin
  122.      Confirmation := Application.MessageBox('Вы действительно хотите выйти?', 'Выход', MB_YESNO);
  123.     CanClose := Confirmation = IDYES;
  124. End;
  125.  
  126. Procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  127. Begin
  128.     If (DiskNumber.Text <> '')Then
  129.         ResButton.Enabled := True
  130.     Else
  131.         ResButton.Enabled := False;
  132. End;
  133.  
  134. Procedure TMainForm.DiskNumberChange(Sender: TObject);
  135. Var
  136.     Value: Double;
  137. Begin
  138.     If TryStrToFloat(DiskNumber.Text, Value) Then
  139.     Begin
  140.         If (Value < 1) Then
  141.         Begin
  142.             BalloonHint1.Title := 'Неверное значение.';
  143.             BalloonHint1.Description := 'N должно быть больше 0.';
  144.             BalloonHint1.ImageIndex := 1;
  145.             BalloonHint1.ShowHint(DiskNumber);
  146.             DiskNumber.Text := '';
  147.         End;
  148.     End;
  149.     DiskNumber.MaxLength := 5;
  150.     If Length(DiskNumber.Text) = 0 Then
  151.     Begin
  152.         Output.Lines.Clear;
  153.     End;
  154. End;
  155.  
  156. Procedure TMainForm.DiskNumberContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
  157. Begin
  158.     Handled := True;
  159. End;
  160.  
  161. Procedure TMainForm.DiskNumberKeyPress(Sender: TObject; Var Key: Char);
  162. Begin
  163.  
  164.     If Key In NumSet Then
  165.     Begin
  166.         If Key = '0' Then
  167.         Begin
  168.             If Length(DiskNumber.Text) = 1 Then
  169.             Begin
  170.                 If DiskNumber.Text[1] In ['0'] Then
  171.                 Begin
  172.                     Key := #0;
  173.                 End;
  174.             End;
  175.             If Length(DiskNumber.Text) = 2 Then
  176.             Begin
  177.                 If (DiskNumber.Text[1] = '-') AND (DiskNumber.Text[2] = '0') Then
  178.                 Begin
  179.                     Key := #0;
  180.                 End;
  181.             End;
  182.         End;
  183.  
  184.         If Key = #45 Then
  185.         Begin
  186.             If Length(DiskNumber.Text) > 0 Then
  187.             Begin
  188.                 BalloonHint1.Title := 'Недопустимый символ.';
  189.                 BalloonHint1.Description := 'Здесь можно ввести только число.';
  190.                 BalloonHint1.ImageIndex := 1;
  191.                 BalloonHint1.ShowHint(DiskNumber);
  192.                 Key := #0;
  193.             End;
  194.         End;
  195.  
  196.         If Key In [',', '.'] Then
  197.         Begin
  198.             Key := FormatSettings.DecimalSeparator;
  199.             If Pos(Key, DiskNumber.Text) <> 0 Then
  200.             Begin
  201.                 BalloonHint1.Title := '???????????? ??????.';
  202.                 BalloonHint1.Description := '????? ????? ?????? ?????? ?????.';
  203.                 BalloonHint1.ImageIndex := 1;
  204.                 BalloonHint1.ShowHint(DiskNumber);
  205.                 Key := #0;
  206.             End
  207.             Else
  208.                 If Length(DiskNumber.Text) > 0 Then
  209.                 Begin
  210.                     If (DiskNumber.Text[1] = '-') AND (Length(DiskNumber.Text) = 1) Then
  211.                     Begin
  212.                         Key := #0;
  213.                     End
  214.                 End
  215.                 Else
  216.                     If DiskNumber.SelStart = 0 Then
  217.                     Begin
  218.                         DiskNumber.Text := '0' + DiskNumber.Text;
  219.                         DiskNumber.SelStart := 1;
  220.                     End;
  221.         End;
  222.     End
  223.     Else
  224.     Begin
  225.         BalloonHint1.Title := 'Недопустимый символ.';
  226.         BalloonHint1.Description := 'Здесь можно ввести только число.';
  227.         BalloonHint1.ShowHint(DiskNumber);
  228.         Key := #0;
  229.     End;
  230. End;
  231.  
  232. Procedure TMainForm.N1Click(Sender: TObject);
  233. Begin
  234.     If Output.Lines.Count = 0 Then
  235.     Begin
  236.         N4.Enabled := False;
  237.     End
  238.     Else
  239.     Begin
  240.         N4.Enabled := True;
  241.     End;
  242. End;
  243.  
  244. Procedure TMainForm.N2Click(Sender: TObject);
  245. Begin
  246.     InstructionForm.ShowModal;
  247. End;
  248.  
  249. Procedure TMainForm.GetPath(Var Path: String);
  250. Begin
  251.     If OpenDialog1.Execute Then
  252.     Begin
  253.         Path := OpenDialog1.FileName;
  254.     End
  255.     Else
  256.     Begin
  257.         ShowMessage('Открытие файла отменено!');
  258.     End;
  259. End;
  260.  
  261. procedure TMainForm.N3Click(Sender: TObject);
  262. var
  263.   IsCorrect, Fail: Boolean;
  264.   Path, Number, Str: String;
  265.   Count: Integer;
  266.   FileElem: TextFile;
  267. begin
  268.   GetPath(Path);
  269.  
  270.   AssignFile(FileElem, Path);
  271.   Fail := False;
  272.   IsCorrect := True;
  273.   Count := 0;
  274.  
  275.   if not FileExists(Path) then
  276.   begin
  277.     ShowMessage('Файл не найден!');
  278.     Exit;
  279.   end;
  280.  
  281.   try
  282.     try
  283.       Reset(FileElem);
  284.     except
  285.       CloseFile(FileElem);
  286.       IsCorrect := False;
  287.       ShowMessage('Ошибка открытия файла.');
  288.     end;
  289.  
  290.     if IsCorrect then
  291.     begin
  292.       while not Eof(FileElem) do
  293.       begin
  294.         ReadLn(FileElem, Str);
  295.         Inc(Count);
  296.       end;
  297.  
  298.       CloseFile(FileElem);
  299.       if Count <> 2 then
  300.         Fail := True;
  301.     end;
  302.  
  303.     if IsCorrect then
  304.     begin
  305.       Reset(FileElem);
  306.  
  307.       try
  308.         Readln(FileElem, Number);
  309.         if not TryStrToInt(Number, Count) then
  310.           Fail := True;
  311.       except
  312.         Fail := True;
  313.       end;
  314.  
  315.     end;
  316.   finally
  317.     CloseFile(FileElem);
  318.     if Fail then
  319.       ShowMessage('Проверьте введенные данные и повторите попытку!')
  320.     else
  321.     begin
  322.       DiskNumber.Text := Number;
  323.     end;
  324.     ShowMessage('Обработка завершена.');
  325.   end;
  326. end;
  327.  
  328. Procedure TMainForm.N4Click(Sender: TObject);
  329. Begin
  330.  
  331.     If SaveDialog1.Execute Then
  332.     Begin
  333.  
  334.         Output.Lines.SaveToFile(SaveDialog1.FileName);
  335.     End
  336.     Else
  337.  
  338.     Begin
  339.         ShowMessage('Сохранение в файл отменено.');
  340.     End;
  341.  
  342. End;
  343.  
  344. Procedure TMainForm.N5Click(Sender: TObject);
  345. Begin
  346.     InformationForm.ShowModal;
  347. End;
  348.  
  349. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement