Advertisement
anticlown

laba.3.2(Delphi)

Nov 17th, 2022 (edited)
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.89 KB | None | 0 0
  1. Program Laba_3_2;
  2.  
  3. Uses
  4.   System.SysUtils;
  5. Const
  6.   MIN_VALUE = 2;
  7.   MAX_VALUE = 255;
  8. Type
  9.   TSet = Set Of Byte;
  10.  
  11. Procedure OutputTaskInfo();
  12. Begin
  13.   Writeln('Данная программа находит все простые числа, не превосходящие данного натурального числа.');
  14.   Writeln('Диапазон для ввода ограничивающего числа: ', MIN_VALUE, '...', MAX_VALUE);
  15. End;
  16.  
  17. Function InputPathToFile(): String;
  18. Var
  19.   Path: String;
  20.   IsCorrect: Boolean;
  21. Begin
  22.   Write('Укажите путь к файлу: ');
  23.  
  24.   Repeat
  25.     IsCorrect := True;
  26.     Readln(Path);
  27.  
  28.     If Not FileExists(Path) Then
  29.     Begin
  30.       Write('По указанному пути файл не найден! Укажите правильный путь: ');
  31.       IsCorrect := False;
  32.     End
  33.     Else If ExtractFileExt(Path) <> '.txt' Then
  34.     Begin
  35.       Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
  36.       IsCorrect := False;
  37.     End;
  38.   Until IsCorrect;
  39.  
  40.   InputPathToFile := Path;
  41. End;
  42.  
  43. Function GetVerificationOfChoice(): Integer;
  44. Var
  45.   Choice: Integer;
  46.   IsCorrect: Boolean;
  47. Begin
  48.   Repeat
  49.     IsCorrect := True;
  50.     Try
  51.       Readln(Choice);
  52.     Except
  53.       Writeln('Проверьте корректность ввода данных!');
  54.       IsCorrect := False;
  55.     End;
  56.  
  57.     If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
  58.     Begin
  59.       Writeln('Для выбора введите 0 или 1!');
  60.       IsCorrect := False;
  61.     End;
  62.  
  63.   Until IsCorrect;
  64.  
  65.   GetVerificationOfChoice := Choice;
  66. End;
  67.  
  68. Function InputNumberFromConsole(): Integer;
  69. Var
  70.   Number: Integer;
  71.   IsCorrect: Boolean;
  72. Begin
  73.   Write('Введите ограничивающее число: ');
  74.  
  75.   Repeat
  76.     IsCorrect := True;
  77.     Try
  78.       Readln(Number);
  79.     Except
  80.       Writeln('Проверьте корректность ввода данных!');
  81.       IsCorrect := False;
  82.     End;
  83.  
  84.     If (IsCorrect And ((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then
  85.     Begin
  86.       Writeln('Введите значение от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
  87.       IsCorrect := False;
  88.     End;
  89.  
  90.   Until IsCorrect;
  91.  
  92.   InputNumberFromConsole := Number;
  93. End;
  94.  
  95. Function InputNumberFromFile(Const Path: String): Integer;
  96. Var
  97.   Number: Integer;
  98.   InputFile: TextFile;
  99. Begin
  100.   Writeln('Происходит чтение ограничивающего числа...');
  101.   AssignFile (InputFile, Path);
  102.  
  103.   Try
  104.     Try
  105.       Reset(InputFile);
  106.       Readln(InputFile, Number);
  107.     Finally
  108.       CloseFile(InputFile);
  109.     End;
  110.  
  111.     If (((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then
  112.     Begin
  113.       Writeln('В файле введено некорректное число! Введите число с консоли!');
  114.       Number := InputNumberFromConsole();
  115.     End;
  116.   Except
  117.     Writeln('Ошибка при чтении данных! Введите ограничивающее число с консоли!');
  118.     Number := InputNumberFromConsole();
  119.   End;
  120.  
  121.   InputNumberFromFile := Number;
  122. End;
  123.  
  124. Procedure OutputNumber(Const Choice, Number: Integer; Path: String);
  125. Var
  126.   OutputFile: TextFile;
  127.   IsCorrect: Boolean;
  128. Begin
  129.   If Choice = 0 Then
  130.     Writeln('Число, ограничивающее диапазон поиска: ', Number);
  131.  
  132.   If Choice = 1 Then
  133.   Begin
  134.     Writeln('Вывод ограничивающего числа в файл...');
  135.  
  136.     Repeat
  137.       IsCorrect := True;
  138.       AssignFile(OutputFile, Path);
  139.  
  140.       Try
  141.         Try
  142.           Rewrite(OutputFile);
  143.           Write(OutputFile, Number);
  144.           Write(OutputFile, #13);
  145.         Finally
  146.           Close(OutputFile);
  147.         End;
  148.       Except
  149.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  150.         IsCorrect := False;
  151.         Path := InputPathToFile();
  152.       End;
  153.     Until IsCorrect;
  154.  
  155.     Writeln('Данные успешно записаны в файл!');
  156.   End;
  157. End;
  158.  
  159. Function EratosthenesSieve(Const Number: Integer): TSet;
  160. Var
  161.   AnsSet: TSet;
  162.   I, J, FinalNumber: Integer;
  163. Begin
  164.   AnsSet := [1..Number];
  165.   FinalNumber := Number + 1;
  166.   I := 2;
  167.  
  168.   While I * I < FinalNumber Do
  169.   Begin
  170.     J := I * I;
  171.  
  172.     While J < FinalNumber Do
  173.     Begin
  174.       Exclude(AnsSet, J);
  175.       J := J + I;
  176.     End;
  177.  
  178.     Inc(I);
  179.   End;
  180.  
  181.   EratosthenesSieve := AnsSet;
  182. End;
  183.  
  184. Procedure OutputAnsSet(Const Choice: Integer; Path: String; Const AnsSet: TSet; Const Number: Integer);
  185. Var
  186.   IsCorrect: Boolean;
  187.   OutputFile: TextFile;
  188.   I, J: Integer;
  189. Begin
  190.   If Choice = 0 Then
  191.   Begin
  192.     Writeln('Вывод множества простых чисел до ', Number, ': ');
  193.  
  194.     For I := 1 To Number Do
  195.       If(I in AnsSet) Then
  196.         Write(I, ' ');
  197.   End;
  198.  
  199.   If Choice = 1 Then
  200.   Begin
  201.     Writeln('Вывод множества простых чисел до ', Number,' в файл...');
  202.  
  203.     Repeat
  204.       IsCorrect := True;
  205.       AssignFile(OutputFile, Path);
  206.  
  207.       Try
  208.         Try
  209.           Append(OutputFile);
  210.  
  211.           For I := 0 To Number Do
  212.             If(I in AnsSet) Then
  213.               Write(OutputFile, I, ' ');
  214.         Finally
  215.           Close(OutputFile);
  216.         End;
  217.       Except
  218.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  219.         IsCorrect := False;
  220.         Path := InputPathToFile();
  221.       End;
  222.  
  223.     Until IsCorrect;
  224.  
  225.     Writeln('Данные успешно записаны в файл!');
  226.   End;
  227. End;
  228.  
  229. Function ProcessUserInput(): Integer;
  230. Var
  231.   PathToIn: String;
  232.   ChoiceForInput, Number: Integer;
  233. Begin
  234.   Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
  235.   ChoiceForInput := GetVerificationOfChoice();
  236.  
  237.   If ChoiceForInput = 0 Then
  238.   Begin
  239.     Number := InputNumberFromConsole();
  240.   End;
  241.  
  242.   If ChoiceForInput = 1 Then
  243.   Begin
  244.     PathToIn := InputPathToFile();
  245.     Number := InputNumberFromFile(PathToIn);
  246.   End;
  247.  
  248.   ProcessUserInput := Number;
  249. End;
  250.  
  251. Procedure ProcessUserOutput(Const AnsSet: TSet; Const Number: Integer);
  252. Var
  253.   PathToOut: String;
  254.   ChoiceForOutput: Byte;
  255. Begin
  256.   Writeln('Вы желаете получть данные в консоль(0) или в файл(1)?');
  257.   ChoiceForOutput := GetVerificationOfChoice();
  258.   If ChoiceForOutput = 1 Then
  259.     PathToOut := InputPathToFile();
  260.  
  261.   OutputNumber(ChoiceForOutput, Number, PathToOut);
  262.   OutputAnsSet(ChoiceForOutput, PathToOut, AnsSet, Number);
  263. End;
  264.  
  265. Procedure Main();
  266. Var
  267.   AnsSet: TSet;
  268.   Number: Integer;
  269. Begin
  270.   OutputTaskInfo();
  271.   Number := ProcessUserInput;
  272.   AnsSet := EratosthenesSieve(Number);
  273.   ProcessUserOutput(AnsSet, Number);
  274. End;
  275.  
  276. Begin
  277.   Main();
  278.   Readln;
  279. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement