Advertisement
THOMAS_SHELBY_18

Lab2_4(Delphi)

Oct 24th, 2023 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.75 KB | Source Code | 0 0
  1. Program Lab2_4;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TArray = Array Of Integer;
  8.  
  9. Var
  10.     CountOfPrimeNumbers: Integer;
  11.     ArrA: TArray;
  12.  
  13. Const
  14.     MIN_ARR_LENGTH = 1;
  15.     MAX_ARR_LENGTH = 20;
  16.     MIN_ARR_VALUE = 1;
  17.     MAX_ARR_VALUE = 100;
  18.  
  19. Function ReadNum(Min, Max: Integer): Integer;
  20. Var
  21.     Num: Integer;
  22.     IsCorrect: Boolean;
  23. Begin
  24.     Repeat
  25.         IsCorrect := True;
  26.         Try
  27.             Readln(Num);
  28.         Except
  29.             Write('Некорректный ввод! Введите значение еще раз: ');
  30.             IsCorrect := False;
  31.         End;
  32.         If (IsCorrect) And ((Num < Min) Or (Num > Max)) Then
  33.         Begin
  34.             Write('Недопустимое значение! Введите значение еще раз: ');
  35.             IsCorrect := False;
  36.         End;
  37.     Until (IsCorrect);
  38.     ReadNum := Num;
  39. End;
  40. Function CheckFile(Path: String; Var Arr: TArray): Boolean;
  41. Var
  42.     I, Buf, Length: Integer;
  43.     IsFileCorrect: Boolean;
  44.     InputFile: TextFile;
  45.  
  46. Begin
  47.     IsFileCorrect := True;
  48.  
  49.     If FileExists(Path) Then
  50.     Begin
  51.         AssignFile(InputFile, Path);
  52.         Try
  53.             Reset(InputFile);
  54.         Except
  55.             Writeln('Не удалось открыть файл');
  56.             IsFileCorrect := False;
  57.         End;
  58.  
  59.         If IsFileCorrect Then
  60.         Begin
  61.             Try
  62.                 Read(InputFile, Length);
  63.             Except
  64.                 Writeln('Длина массива введена некорректно!');
  65.                 IsFileCorrect := False;
  66.             End;
  67.  
  68.             If Not Eoln(InputFile) Or EoF(InputFile) Then
  69.             Begin
  70.                 Writeln('В первой строке должна содержаться длина массива, во второй строке - все его элементы!');
  71.                 IsFileCorrect := False;
  72.             End;
  73.  
  74.             If IsFileCorrect And (Length < MIN_ARR_LENGTH) Or (Length > MAX_ARR_LENGTH) Then
  75.             Begin
  76.                 Writeln('Введена длина массива, не входящая в диапазон допустимых значений!');
  77.                 IsFileCorrect := False;
  78.             End;
  79.  
  80.             SetLength(Arr, Length);
  81.             I := 0;
  82.  
  83.             While (IsFileCorrect And (I < Length)) Do
  84.             Begin
  85.                 Try
  86.                     Read(InputFile, Buf);
  87.                 Except
  88.                     Writeln('Элементы массива введены некорректно!');
  89.                     IsFileCorrect := False;
  90.                 End;
  91.  
  92.                 If IsFileCorrect And Eoln(InputFile) And Not (I = High(Arr)) Then
  93.                 Begin
  94.                     Writeln('Все элементы массива должны быть записаны во второй строке!');
  95.                     IsFileCorrect := False;
  96.                 End;
  97.                
  98.                 If IsFileCorrect And (Buf < MIN_ARR_VALUE) Or (Buf > MAX_ARR_VALUE) Then
  99.                 Begin
  100.                     Writeln('Элементы массива не входят в диапазон допустимых значений!');
  101.                     IsFileCorrect := False;
  102.                 End;
  103.  
  104.                 Arr[I] := Buf;
  105.                 Inc(I);
  106.             End;
  107.  
  108.             If IsFileCorrect And Not EoF(InputFile) Then
  109.             Begin
  110.                 Writeln('Данные в файле представлены в неправильном формате!');
  111.                 IsFileCorrect := False;
  112.             End;
  113.  
  114.             CloseFile(InputFile);
  115.         End;
  116.     End
  117.     Else
  118.     Begin
  119.         Writeln('Файла по данному пути не существует!');
  120.         IsFileCorrect := False;
  121.     End;
  122.     CheckFile := IsFileCorrect;
  123. End;
  124.  
  125. Procedure InputDataFromConsole(Var Arr: TArray);
  126. Var
  127.     ArrayLength, I, Buf: Integer;
  128. Begin
  129.     Writeln('Введите количесво элементов массива от ', MIN_ARR_LENGTH, ' до ', MAX_ARR_LENGTH, ': ');
  130.     ArrayLength := ReadNum(MIN_ARR_LENGTH, MAX_ARR_LENGTH);
  131.  
  132.     SetLength(Arr, ArrayLength);
  133.  
  134.     Writeln('Введите элементы массива', #10, 'Каждый элемент массива - натуральное число от ',   MIN_ARR_VALUE, ' до ', MAX_ARR_VALUE);
  135.     For I := 0 To High(Arr) Do
  136.     Begin
  137.         Write('Введите элемент ', I + 1, ': ');
  138.         Buf := ReadNum(MIN_ARR_VALUE, MAX_ARR_VALUE);
  139.         Arr[I] := Buf;
  140.     End;
  141. End;
  142.  
  143.  Procedure InputDataFromFile(Var Arr: TArray);
  144. Var
  145.     PathFile: String;
  146.     IsInputFromFileSuccessfully: Boolean;
  147. Begin
  148. Writeln('Данные в файле должны содержать:', #10, 'Натуральное число - количество элементов массива от ', MIN_ARR_LENGTH, ' до ', MAX_ARR_LENGTH, #10, 'Элементы массива, записанные через пробел, допустимые значения для которых от ', MIN_ARR_VALUE, ' до ', MAX_ARR_VALUE);
  149.         Repeat
  150.             Write('Введите путь к файлу с его раширением: ');
  151.             Readln(PathFile);
  152.             IsInputFromFileSuccessfully := CheckFile(PathFile, Arr);
  153.         Until IsInputFromFileSuccessfully;
  154. End;
  155.  
  156.  
  157. Procedure InputData(Var Arr: TArray);
  158. Var
  159.     Choice: Integer;
  160. Begin
  161.     Write('Выберите вариант ввода:', #10, '1. Ввод из консоли', #10, '2. Ввод из файла', #10, 'Использовать вариант: ');
  162.     Choice := ReadNum(1,2);
  163.  
  164.     If Choice = 1 Then
  165.         InputDataFromConsole(Arr)
  166.     Else
  167.         InputDataFromFile(Arr);
  168. End;
  169.  
  170. Procedure OutputDataToConsole(Count: Integer);
  171. Begin
  172.     If Count = 0 Then
  173.         Writeln('Среди элементов массива нет простых чисел')
  174.     Else
  175.         Writeln('Число простых чисел среди элементов массива: ', Count);
  176. End;
  177.  
  178. Procedure OutputDataToFile(Count: Integer);
  179. Var
  180.     IsPathCorrect: Boolean;
  181.     Path: String;
  182.     OutputFile: TextFile;
  183. Begin
  184.     Writeln('Для вывода введите путь к файлу и его имя (например, F:\Projects\Matrix\Имя файла.txt). Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)');
  185.         Repeat
  186.             IsPathCorrect := True;
  187.             Write('Введите путь: ');
  188.             Readln(Path);
  189.             If Path = '' Then
  190.                 IsPathCorrect := false
  191.             Else
  192.             Begin
  193.                 AssignFile(OutputFile, Path);
  194.                 Try
  195.                     Rewrite(OutputFile);
  196.                 Except
  197.                     Writeln('Не удалось вывести в Файл');
  198.                     IsPathCorrect := False;
  199.                 End;
  200.             End;
  201.         Until IsPathCorrect;
  202.  
  203.         If Count = 0 Then
  204.             Writeln(OutputFile, 'Среди элементов массива нет простых чисел')
  205.         Else
  206.             Writeln(OutputFile, 'Число простых чисел среди элементов массива: ', Count);
  207.         CloseFile(OutputFile);
  208.         Writeln('Вывод данных...  успешно!');
  209. End;
  210.  
  211.  
  212. Procedure OutputData(Count: Integer);
  213. Var
  214.     Choice: Integer;
  215. Begin
  216.     Write('Выберите вариант вывода:', #10, '1. Вывод в консоль', #10, '2. Вывод файл', #10, 'Использовать вариант: ');
  217.     Choice := ReadNum(1,2);
  218.  
  219.     If Choice = 1 Then
  220.         OutputDataToConsole(Count)
  221.     Else
  222.         OutputDataToFile(Count);
  223. End;
  224.  
  225. Function CheckNumber(Num: Integer): Boolean;
  226. Var
  227.     I: Integer;
  228.     NumRoot: Real;
  229. Begin
  230.      NumRoot := Sqrt(Num);
  231.     I := 1;
  232.     Repeat
  233.         Inc(I);
  234.     Until ((Num Mod I = 0) Or (I > NumRoot));
  235.  
  236.     CheckNumber := (I > NumRoot);
  237.     If Num = 1 Then
  238.         CheckNumber := False;
  239. End;
  240.  
  241. Function GetСountOfPrimeNumbers(Var Arr: TArray): Integer;
  242. Var
  243.     I, Count: Integer;
  244.     IsPrimeNumber: Boolean;
  245. Begin
  246.     Count := 0;
  247.  
  248.     For I := 0 To High(Arr) Do
  249.     Begin
  250.         IsPrimeNumber := CheckNumber(Arr[I]);
  251.         If IsPrimeNumber Then
  252.             Inc(Count);
  253.     End;
  254.     GetСountOfPrimeNumbers := Count;
  255. End;
  256.  
  257. Begin
  258.     Writeln('Данная программа вычислит количество простых чисел в массиве');
  259.     InputData(ArrA);
  260.     CountOfPrimeNumbers := GetСountOfPrimeNumbers(ArrA);
  261.     OutputData(CountOfPrimeNumbers);
  262.     Readln;
  263. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement