Vanilla_Fury

laba_4_2_del

Feb 13th, 2021
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  1. unit laba_4_2_f1;
  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.Menus, Vcl.StdCtrls, System.RegularExpressions;
  8.  
  9. type
  10. TArrStr = Array of String;
  11.  
  12. TFormMain = class(TForm)
  13. MainMenu1: TMainMenu;
  14. N1: TMenuItem;
  15. N3: TMenuItem;
  16. EditN: TEdit;
  17. ButtonOk: TButton;
  18. N4: TMenuItem;
  19. LabelAnswer: TLabel;
  20. BalloonHint1: TBalloonHint;
  21. procedure N3Click(Sender: TObject);
  22. procedure N4Click(Sender: TObject);
  23. procedure ButtonOkClick(Sender: TObject);
  24. function BruteForce(N, CellIsNowOn: ShortInt) : Integer;
  25. procedure EditNChange(Sender: TObject);
  26.  
  27. private
  28.  
  29. public
  30. { Public declarations }
  31. end;
  32.  
  33. var
  34. FormMain: TFormMain;
  35.  
  36. implementation
  37.  
  38. {$R *.dfm}
  39.  
  40. function FindRegEx(SInput, StrRegEx: String; StrIfNothingFound: String = '') : TArrStr; forward;
  41.  
  42. procedure TFormMain.ButtonOkClick(Sender: TObject);
  43. var
  44. Answer, N: Integer;
  45. Point: TPoint;
  46.  
  47. begin
  48. with EditN do
  49. begin
  50. Text := FindRegEx(Text, '^[0]*([1-2]\d|[3]\d?|[4][0]?|[5-9])$')[0];
  51. if Text = '' then
  52. begin
  53. BalloonHint1.Title := 'Ошибка';
  54. BalloonHint1.Description := 'Введите целое число от 3 до 40.';
  55. Point.X := Width;
  56. Point.Y := Height;
  57. Balloonhint1.ShowHint(ClientToScreen(Point));
  58. LabelAnswer.Caption := 'Ответ: ';
  59. end
  60. else
  61. begin
  62. N := StrToInt(Text);
  63. Answer := BruteForce(N, 1);
  64. LabelAnswer.Caption := 'Ответ: ' + IntToStr(Answer);
  65. end;
  66. end;
  67. end;
  68.  
  69. procedure TFormMain.EditNChange(Sender: TObject);
  70. var
  71. SelTemp: Integer;
  72. begin
  73. with EditN do
  74. begin
  75. SelTemp := SelStart;
  76. Text := FindRegEx(Text, '[1-9]\d?')[0];
  77. SelStart := SelTemp;
  78. end;
  79. end;
  80.  
  81. function TFormMain.BruteForce(N, CellIsNowOn: ShortInt) : Integer;
  82. var
  83. Answer: Integer;
  84.  
  85. begin
  86. Answer := 0;
  87. if CellIsNowOn < N then
  88. begin
  89. Answer := Answer + BruteForce(N, CellIsNowOn + 1);
  90. if (CellIsNowOn < N - 1) then
  91. Answer := Answer + BruteForce(N, CellIsNowOn + 2);
  92. end
  93. else
  94. Answer := 1;
  95. Result := Answer;
  96. end;
  97.  
  98. procedure TFormMain.N3Click(Sender: TObject);
  99. begin
  100. ShowMessage('Панев Александр, гр. 051007' + #10#13 + 'Минск, 2021');
  101. end;
  102.  
  103. procedure TFormMain.N4Click(Sender: TObject);
  104. begin
  105. ShowMessage('Имеется полоска клетчатой бумаги шириной в одну клетку и ' +
  106. 'длиной в n клеток. На первой клетке установлена шашка. Одним ходом ' +
  107. 'шашку можно передвигать на одну или две клетки. Разработать ' +
  108. 'рекурсивную функцию, определяющую количество способов продвижения ' +
  109. 'шашки на n-ю клетку.');
  110. end;
  111.  
  112. function FindRegEx(SInput, StrRegEx: String; StrIfNothingFound: String = '') : TArrStr;
  113. var
  114. ArrStr: TArrStr;
  115. RegEx: TRegEx;
  116. MatchCollection: TMatchCollection;
  117. i: Integer;
  118. begin
  119. RegEx := TRegEx.Create(StrRegEx);
  120. MatchCollection := RegEx.Matches(SInput);
  121. SetLength(ArrStr, MatchCollection.Count);
  122. for i := 0 to MatchCollection.Count - 1 do
  123. ArrStr[i] := MatchCollection.Item[i].Value;
  124.  
  125. if (Length(ArrStr) < 1) then
  126. ArrStr := [StrIfNothingFound];
  127. Result := ArrStr;
  128. end;
  129.  
  130. end.
Advertisement
Add Comment
Please, Sign In to add comment