Advertisement
ksyshshot

Lab.2.2.f

Feb 3rd, 2023
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.76 KB | Source Code | 0 0
  1. unit Lab_1_4_Forms;
  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.Grids, Vcl.StdCtrls;
  8.  
  9. type
  10.   TForm2_2 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     ButtonFile: TMenuItem;
  13.     ButtonOpenFile: TMenuItem;
  14.     ButtonSaveFile: TMenuItem;
  15.     ButtonInstruction: TMenuItem;
  16.     ButtonAbout: TMenuItem;
  17.     OpenDialog1: TOpenDialog;
  18.     SaveDialog1: TSaveDialog;
  19.     LabelTask: TLabel;
  20.     LabelNumber: TLabel;
  21.     EditNumber: TEdit;
  22.     LabelAnswer: TLabel;
  23.     ButtonFindAnswer: TButton;
  24.     MemoAnswer: TMemo;
  25.     procedure ButtonOpenFileClick(Sender: TObject);
  26.     procedure ButtonSaveFileClick(Sender: TObject);
  27.     procedure ButtonAboutClick(Sender: TObject);
  28.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  29.     procedure ButtonInstructionClick(Sender: TObject);
  30.     procedure EditNumberKeyPress(Sender: TObject; var Key: Char);
  31.     procedure ButtonFindAnswerClick(Sender: TObject);
  32.     procedure EditNumberChange(Sender: TObject);
  33.   private
  34.     { Private declarations }
  35.   public
  36.     { Public declarations }
  37.   end;
  38.  
  39. var
  40.   Form2_2: TForm2_2;
  41.  
  42. implementation
  43.  
  44. {$R *.dfm}
  45.  
  46. uses UnitError, UnitAbout, UnitExit, UnitInstruction_2_2;
  47.  
  48. type
  49.     TArr = Array Of Integer;
  50.  
  51. const
  52.     MAX_VALUE = 1000;                               //12004
  53.     MIN_VALUE = 1;
  54.  
  55. Function ConsistencyUpToNumber(Number: Integer): TArr;
  56. Var
  57.     I: Integer;
  58.     ArrNumbers: TArr;
  59. Begin
  60.     SetLength (ArrNumbers, Number - 1);
  61.     I := 0;
  62.     While (I < Number - 1) Do
  63.     Begin
  64.         ArrNumbers[I] := I + 2;
  65.         Inc(I);
  66.     End;
  67.     ConsistencyUpToNumber := ArrNumbers;
  68. End;
  69.  
  70. Function ArrayOfPrime(Number: Integer): TArr;
  71. Var
  72.     IsPrime: Array Of Boolean;
  73.     I, J: Integer;
  74.     PrimeNumbers: TArr;
  75. Begin
  76.     SetLength(IsPrime, Number);
  77.     For I := 0 To Number - 1 Do
  78.         IsPrime[I] := True;
  79.     I := 2;
  80.     While (I * I < Number) Do
  81.     Begin
  82.         If (IsPrime[I]) Then
  83.         Begin
  84.             J := 2 * I;
  85.             While (J < Number) Do
  86.             Begin
  87.                 IsPrime[J] := False;
  88.                 J := J + I;
  89.             End;
  90.         End;
  91.         Inc (I);
  92.     End;
  93.     SetLength(PrimeNumbers, Number);
  94.     Dec(Number);
  95.     J := 0;
  96.     For I := 2 To Number Do
  97.         If (IsPrime[I]) Then
  98.         Begin
  99.             PrimeNumbers[J] := I;
  100.             Inc (J);
  101.         End;
  102.     ArrayOfPrime := PrimeNumbers;
  103. End;
  104.  
  105. Function SecondDivision(ArrNumbersElement, Quotient, Number: Integer): Integer;
  106. Var
  107.     ArrCorrectnessElement, K: Integer;
  108.     ArrOfPrime: TArr;
  109. Begin
  110.     ArrCorrectnessElement := 0;
  111.     ArrOfPrime := ArrayOfPrime(Number);
  112.     K := 0;
  113.     While ((K < Number) And (ArrOfPrime[K] <> 0) And (ArrOfPrime[K] <= Quotient)) Do
  114.     Begin
  115.         If (Quotient = ArrOfPrime[K]) Then
  116.         Begin
  117.             ArrCorrectnessElement := ArrNumbersElement;
  118.             K := Number;
  119.         End;
  120.         Inc (K);
  121.     End;
  122.     SecondDivision := ArrCorrectnessElement;
  123. End;
  124.  
  125. procedure TForm2_2.ButtonAboutClick(Sender: TObject);
  126. begin
  127.     UnitAbout.FormAbout.ShowModal();
  128. end;
  129.  
  130. Function FindingRequiredNumbers(Number: Integer): TArr;
  131. Var
  132.     I, K, Quotient: Integer;
  133.     ArrCorrectness, ArrNumbers, ArrOfPrime: TArr;
  134. Begin
  135.     ArrOfPrime := ArrayOfPrime(Number);
  136.     ArrNumbers := ConsistencyUpToNumber(Number);
  137.     Dec(Number);
  138.     SetLength (ArrCorrectness, Number);
  139.     Dec(Number);
  140.     For I := 0 To Number Do
  141.     Begin
  142.         K := 0;
  143.         While ((K < Number) And (ArrOfPrime[K] <> 0) And (ArrOfPrime[K] < ArrNumbers[I])) Do
  144.         Begin
  145.             If (ArrNumbers[I] Mod ArrOfPrime[K] = 0) Then
  146.             Begin
  147.                 Quotient := ArrNumbers[I] Div ArrOfPrime[K];
  148.                 ArrCorrectness[I] := SecondDivision(ArrNumbers[I], Quotient, Number + 2);
  149.                 K := Number;
  150.             End;
  151.             Inc (K);
  152.         End;
  153.     End;
  154.     FindingRequiredNumbers := ArrCorrectness;
  155. End;
  156.  
  157. procedure TForm2_2.ButtonFindAnswerClick(Sender: TObject);
  158. var
  159.     Number, ZeroValue, I: Integer;
  160.     ArrayOfCorrect: TArr;
  161.     IsCorrect: Boolean;
  162.     Error: String;
  163. begin
  164.     MemoAnswer.Text := '';
  165.     IsCorrect := True;
  166.     try
  167.         Number := StrToInt(EditNumber.Text);
  168.         if (Number > MAX_VALUE) or (Number < MIN_VALUE) then
  169.         begin
  170.             Error := 'Число не входит в диапазон допустимых значений. ';
  171.             IsCorrect := false;
  172.         end;
  173.     except
  174.         IsCorrect := False;
  175.         Error := 'Некорректно введённое число. ';
  176.     end;
  177.     if (IsCorrect) then
  178.     begin
  179.         ArrayOfCorrect := FindingRequiredNumbers(Number);
  180.         MemoAnswer.Lines.Add('Полученные натуральные числа:');
  181.         Dec(Number, 2);
  182.         ZeroValue := Number;
  183.         For I := 0 To Number Do
  184.             If (ArrayOfCorrect[I] <> 0) Then
  185.             Begin
  186.                 MemoAnswer.Text := MemoAnswer.Text + IntToStr(ArrayOfCorrect[I]) + ' ';
  187.                 Dec(ZeroValue);
  188.             End;
  189.         If (ZeroValue = Number) Then
  190.             MemoAnswer.Lines.Add('Натуральные числа, соответствующие требованиям, не найдены');
  191.         ButtonSaveFile.Enabled := true;
  192.     end
  193.     else
  194.     begin
  195.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  196.         UnitError.FormError.ShowModal();
  197.         UnitError.FormError.LabelError.Caption := '';
  198.     end;
  199. end;
  200.  
  201. procedure TForm2_2.ButtonInstructionClick(Sender: TObject);
  202. begin
  203.     UnitInstruction_2_2.FormInstruction_2_2.ShowModal();
  204. end;
  205.  
  206. procedure TForm2_2.ButtonOpenFileClick(Sender: TObject);
  207. var
  208.     F: TextFile;
  209.     Path, Error, NumberStr: String;
  210.     Number, Res: Integer;
  211.     IsCorrect: Boolean;
  212. begin
  213.     IsCorrect := True;
  214.     Error := '';
  215.     Number := 0;
  216.     Res := 0;
  217.     If OpenDialog1.Execute() Then
  218.     Begin
  219.         Path := OpenDialog1.FileName;
  220.         AssignFile(F, Path);
  221.         Try
  222.             Reset(F);
  223.             Try
  224.                 Read(F, NumberStr);
  225.                 if (NumberStr = '') then
  226.                 begin
  227.                     Error := 'В файле не найдено элементов. ';
  228.                     IsCorrect := False;
  229.                 end
  230.                 else
  231.                 begin
  232.                     Number := StrToInt(NumberStr);
  233.                     if not(EOF(F)) then
  234.                     begin
  235.                         Error := Error + 'Найдены лишние элементы в файле. ';
  236.                         IsCorrect := False;
  237.                     end;
  238.                     if (Number > MAX_VALUE) or (Number < MIN_VALUE) then
  239.                     begin
  240.                         Error := Error + 'Число не входит в диапазон допустимых значений. ';
  241.                         IsCorrect := false;
  242.                     end;
  243.                     end;
  244.             Finally
  245.                 CloseFile(F);
  246.             End;
  247.         Except
  248.             IsCorrect := False;
  249.             Error := Error + 'Нет доступа к файлу';
  250.         End;
  251.         If not(IsCorrect) Then
  252.         Begin
  253.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  254.             Res := UnitError.FormError.ShowModal();
  255.         End;
  256.         if Res > 0 Then
  257.             UnitError.FormError.LabelError.Caption := ''
  258.         else
  259.         begin
  260.             EditNumber.Text := IntToStr(Number);
  261.         end;
  262.     End;
  263. end;
  264.  
  265. procedure TForm2_2.ButtonSaveFileClick(Sender: TObject);
  266. var
  267.     F: TextFile;
  268.     Path, Error: String;
  269.     Res: Integer;
  270.     IsCorrect: Boolean;
  271. begin
  272.     IsCorrect := True;
  273.     Res := 0;
  274.     Error := '';
  275.     if SaveDialog1.Execute() then
  276.     begin
  277.         Path := SaveDialog1.FileName;
  278.         AssignFile(F, Path);
  279.         Try
  280.             Rewrite(F);
  281.             Try
  282.                 Write(F, MemoAnswer.Text);
  283.             Finally
  284.                 CloseFile(F);
  285.             End;
  286.         Except
  287.             IsCorrect := False;
  288.             Error := 'Нет доступа к файлу. ';
  289.         End;
  290.         if not(IsCorrect) then
  291.         begin
  292.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  293.             Res := UnitError.FormError.ShowModal();
  294.         end;
  295.         if Res > 0 Then
  296.             UnitError.FormError.LabelError.Caption := '';
  297.     end;
  298. end;
  299.  
  300. procedure TForm2_2.EditNumberChange(Sender: TObject);
  301. begin
  302.     ButtonFindAnswer.Enabled := True;
  303.     MemoAnswer.Text := '';
  304.     ButtonSaveFile.Enabled := false;
  305.     if (Length(EditNumber.Text) = 0) then
  306.         ButtonFindAnswer.Enabled := false;
  307. end;
  308.  
  309. procedure TForm2_2.EditNumberKeyPress(Sender: TObject; var Key: Char);
  310. begin
  311.     if not(Key in [#8, #13, '0'..'9']) then
  312.         Key := #0;
  313.     if (Length(EditNumber.Text) = 0) and (Key in [#13, '0']) then
  314.         Key := #0;
  315.     if (Length(EditNumber.Text) = 1) and not(EditNumber.Text[1] = '1') then
  316.         EditNumber.MaxLength := 3;
  317.     if (Length(EditNumber.Text) = 3) and not(EditNumber.Text = '100') then
  318.         EditNumber.MaxLength := 3
  319.     else
  320.         EditNumber.MaxLength := 4;
  321.     if (Length(EditNumber.Text) = 3) and (EditNumber.Text = '100') and not(Key in ['0', #8, #13]) then
  322.         Key := #0;
  323.     if (Length(EditNumber.Text) > 0) and (Key = #13) then
  324.         ButtonFindAnswerClick(Sender);
  325. end;
  326.  
  327. procedure TForm2_2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  328. Var
  329.     Res: Integer;
  330. begin
  331.     Res := UnitExit.FormExit.ShowModal();
  332.     If Res = mrOk Then
  333.         CanClose := True
  334.     Else
  335.         CanClose := False;
  336. end;
  337.  
  338. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement