ValeriaAVR

laba23

Oct 24th, 2024
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.48 KB | None | 0 0
  1. Program Lab23;
  2.  
  3. Uses
  4.     SysUtils;
  5.  
  6. Const
  7.     MIN_N = 2;
  8.     MAX_N = 100;
  9.     MIN_A = -10000;
  10.     MAX_A = 10000;
  11.  
  12. Type
  13.     TMatrix = Array Of Array Of Double;
  14.  
  15. Function InputAndCheckChoice(IsCorrect: Boolean): Integer;
  16. Var
  17.     Choice: Integer;
  18. Begin
  19.     Choice := 0;
  20.     Repeat
  21.         IsCorrect := True;
  22.         WriteLn('Введите ваш выбор: ');
  23.         Try
  24.             ReadLn(Choice);
  25.         Except
  26.             IsCorrect := False;
  27.             WriteLn('Некорректный ввод. Введите 1 или 2.');
  28.         End;
  29.  
  30.         If IsCorrect And (Choice <> 1) And (Choice <> 2) Then
  31.         Begin
  32.             WriteLn('Введите 1 или 2.');
  33.             IsCorrect := False;
  34.         End;
  35.     Until IsCorrect;
  36.     InputAndCheckChoice := Choice;
  37. End;
  38.  
  39. Function InputAndCheckN(IsCorrect: Boolean): Integer;
  40. Var
  41.     N: Integer;
  42. Begin
  43.     N := 0;
  44.     Repeat
  45.         IsCorrect := True;
  46.         WriteLn('Введите порядок матрицы n: ');
  47.         Try
  48.             ReadLn(N);
  49.         Except
  50.             IsCorrect := False;
  51.             WriteLn('Некорректный ввод. Введите целое число.');
  52.         End;
  53.  
  54.         If IsCorrect And ((N < MIN_N) Or (N > MAX_N)) Then
  55.         Begin
  56.             WriteLn('Диапазон значений n от ', MIN_N, ' до ', MAX_N, '. ');
  57.             IsCorrect := False;
  58.         End;
  59.     Until IsCorrect;
  60.     InputAndCheckN := N;
  61. End;
  62.  
  63. Function IsFileExists(Const FileName: String): Boolean;
  64. Begin
  65.     IsFileExists := FileExists(FileName);
  66.     If Not FileExists(FileName) Then
  67.         WriteLn('Файл не существует.');
  68. End;
  69.  
  70. Function IsFileTxt(Const FileName: String): Boolean;
  71. Var
  72.     FileType: String;
  73. Begin
  74.     If (Length(FileName) > 4) Then
  75.     Begin
  76.         FileType := FileName.SubString(FileName.Length - 4);
  77.         If (FileType = '.txt') Then
  78.             IsFileTxt := True
  79.         Else
  80.         Begin
  81.             WriteLn('Файл не является текстовым. ');
  82.             IsFileTxt := False;
  83.         End;
  84.     End
  85.     Else
  86.     Begin
  87.         WriteLn('Введите корректное имя файла. ');
  88.         IsFileTxt := False;
  89.     End;
  90. End;
  91.  
  92. Function IsFileNotEmpty(Var MyFile: TextFile): Boolean;
  93. Var
  94.     IsNotEmpty: Boolean;
  95. Begin
  96.     Try
  97.         Try
  98.             Reset(MyFile);
  99.             IsNotEmpty := Not Eof(MyFile);
  100.             If (Not IsNotEmpty) Then
  101.                 WriteLn('Этот файл пустой. ');
  102.         Except
  103.             WriteLn('Непредвиденная ошибка.');
  104.             IsNotEmpty := False;
  105.         End;
  106.     Finally
  107.         CloseFile(MyFile);
  108.     End;
  109.     IsFileNotEmpty := IsNotEmpty;
  110. End;
  111.  
  112. Function IsFileWritable(Var MyFile: TextFile): Boolean;
  113. Begin
  114.     IsFileWritable := True;
  115.     Try
  116.         Rewrite(MyFile);
  117.         Close(MyFile);
  118.     Except
  119.         IsFileWritable := False;
  120.         WriteLn('Этот файл невозможно открыть для записи.');
  121.     End;
  122. End;
  123.  
  124. Function IsFileReadable(Var MyFile: TextFile): Boolean;
  125. Begin
  126.     IsFileReadable := True;
  127.     Try
  128.         Reset(MyFile);
  129.         Close(MyFile);
  130.     Except
  131.         IsFileReadable := False;
  132.         WriteLn('Этот файл невозможно открыть для чтения.');
  133.     End;
  134. End;
  135.  
  136. Function RequestFileNameForReading(Var MyFile: TextFile; IsCorrect: Boolean): String;
  137. Var
  138.     FileName: String;
  139. Begin
  140.     Repeat
  141.         WriteLn('Введите имя файла с путём:');
  142.         ReadLn(FileName);
  143.         AssignFile(MyFile, FileName);
  144.         IsCorrect := IsFileExists(FileName) And IsFileTxt(FileName) And IsFileReadable(MyFile) And IsFileNotEmpty(MyFile);
  145.     Until IsCorrect;
  146.     RequestFileNameForReading := FileName;
  147. End;
  148.  
  149. Function RequestFileNameForWriting(Var MyFile: TextFile; IsCorrect: Boolean): String;
  150. Var
  151.     FileName: String;
  152. Begin
  153.     Repeat
  154.         WriteLn('Введите имя файла с путём: ');
  155.         ReadLn(FileName);
  156.         AssignFile(MyFile, FileName);
  157.         IsCorrect := IsFileExists(FileName) And IsFileTxt(FileName) And IsFileWritable(MyFile);
  158.     Until IsCorrect;
  159.     RequestFileNameForWriting := FileName;
  160. End;
  161.  
  162. Procedure CreateMatrix(N: Integer; Var Matrix: TMatrix; IsCorrect: Boolean);
  163. Var
  164.     I, J: Integer;
  165. Begin
  166.     SetLength(Matrix, N, N);
  167.     For I := 0 To High(Matrix) Do
  168.         For J := 0 To High(Matrix) Do
  169.         Begin
  170.             Repeat
  171.                 IsCorrect := True;
  172.                 WriteLn('Введите элемент матрицы А', I + 1, J + 1, ': ');
  173.                 Try
  174.                     ReadLn(Matrix[I][J]);
  175.                 Except
  176.                     IsCorrect := False;
  177.                     WriteLn('Некорректный ввод. Введите число.');
  178.                 End;
  179.  
  180.                 If IsCorrect And ((Matrix[I][J] < MIN_A) Or (Matrix[I][J] > MAX_A)) Then
  181.                 Begin
  182.                     WriteLn('Некорректный ввод данных.');
  183.                     WriteLn('Диапазон значений A от ', MIN_A, ' до ', MAX_A, '. ');
  184.                     IsCorrect := False;
  185.                 End;
  186.  
  187.             Until IsCorrect;
  188.         End;
  189. End;
  190.  
  191. Function InputSizeFromFile(Var Size: Integer; Var MyFile: TextFile; IsCorrect: Boolean): Boolean;
  192. Var
  193.     Count, N, I, J: Integer;
  194.     Elements: TArray<String>;
  195.     Line: String;
  196.     TempMatrix: TMatrix;
  197. Begin
  198.     Line := '';
  199.     Count := 0;
  200.     Size := 0;
  201.     IsCorrect := True;
  202.     Try
  203.         Try
  204.             Reset(MyFile);
  205.             While Not Eof(MyFile) Do
  206.             Begin
  207.                 ReadLn(MyFile, Line);
  208.                 Elements := Line.Split([' ']);
  209.                 Count := Count + Length(Elements);
  210.             End;
  211.         Except
  212.             WriteLn('Непредвиденная ошибка.');
  213.             IsCorrect := False;
  214.         End;
  215.     Finally
  216.         CloseFile(MyFile);
  217.     End;
  218.     N := Trunc(Sqrt(Count));
  219.     If IsCorrect And (N * N = Count) And ((N > MIN_N) Or (N < MAX_N)) Then
  220.     Begin
  221.         SetLength(TempMatrix, N, N);
  222.         Try
  223.             Try
  224.                 Reset(MyFile);
  225.                 For I := 0 To N - 1 Do
  226.                     For J := 0 To N - 1 Do
  227.                     Begin
  228.                         Read(MyFile, TempMatrix[I][J]);
  229.                         If ((TempMatrix[I][J] < MIN_A) Or (TempMatrix[I][J] > MAX_A)) Then
  230.                             IsCorrect := False;
  231.                     End;
  232.                 If Not IsCorrect Then
  233.                     WriteLn('Элементы матрицы выходят за диапазон допустимых значений.');
  234.                 Size := N;
  235.             Except
  236.                 WriteLn('Матрица содержит данные неверного типа.');
  237.                 IsCorrect := False;
  238.             End;
  239.         Finally
  240.             CloseFile(MyFile);
  241.         End;
  242.     End
  243.     Else
  244.     Begin
  245.         WriteLn('Матрица должна быть квадратной. Диапазон значений n:', MIN_N, '..', MAX_N);
  246.         IsCorrect := False;
  247.     End;
  248.     InputSizeFromFile := IsCorrect;
  249. End;
  250.  
  251. Function ReadMatrix(Var MyFile: TextFile; Var Matrix: TMatrix; Const Size: Integer; IsCorrect: Boolean): Boolean;
  252. Var
  253.     I, J: Integer;
  254. Begin
  255.     SetLength(Matrix, Size, Size);
  256.     IsCorrect := True;
  257.     Try
  258.         Try
  259.             Reset(MyFile);
  260.             For I := 0 To High(Matrix) Do
  261.                 For J := 0 To High(Matrix[I]) Do
  262.                     Read(MyFile, Matrix[I][J]);
  263.         Except
  264.             WriteLn('Непредвиденная ошибка.');
  265.             IsCorrect := False;
  266.         End;
  267.     Finally
  268.         CloseFile(MyFile);
  269.     End;
  270.     ReadMatrix := IsCorrect;
  271. End;
  272.  
  273. Function WriteToFile(Var MyFile: TextFile; Const Sum: Double; IsCorrect: Boolean): Boolean;
  274. Begin
  275.     IsCorrect := True;
  276.     Try
  277.         Try
  278.             Rewrite(MyFile);
  279.             WriteLn(MyFile, Sum:8:6);
  280.             WriteLn('Результат выведен в файле.');
  281.         Except
  282.             WriteLn('Непредвиденная ошибка.');
  283.             IsCorrect := False;
  284.         End;
  285.     Finally
  286.         CloseFile(MyFile);
  287.     End;
  288.     WriteToFile := IsCorrect;
  289. End;
  290.  
  291. Function SumElements(Var Matrix: TMatrix; Const N: Integer): Double;
  292. Var
  293.     I, J: Integer;
  294.     Sum: Double;
  295. Begin
  296.     Sum := 0;
  297.     For I := 1 To High(Matrix) Do
  298.     Begin
  299.         For J := 0 To I - 1 Do
  300.             If (Matrix[I][J] > 0) Then
  301.                 Sum := Sum + Matrix[I][J];
  302.     End;
  303.     SumElements := Sum;
  304. End;
  305.  
  306. Var
  307.     N: Integer;
  308.     Sum: Double;
  309.     IsCorrect: Boolean;
  310.     Choice: Integer;
  311.     MyMatrix: TMatrix;
  312.     MyFile: TextFile;
  313.     MyFileName: String;
  314.  
  315. Begin
  316.     N := 0;
  317.     IsCorrect := False;
  318.     WriteLn('Данная программа считает сумму положительных элементов матрицы порядка n, стоящих под главной диагональю.', #13#10,
  319.         'Диапазон значений порядка матрицы n: ', MIN_N, '...', MAX_N, #13#10, 'Диапазон для значений элементов матрицы: ', MIN_A, '...',
  320.         MAX_A, #13#10, 'Откуда вы хотите вводить данные?', #13#10, '1 - консоль, 2 - файл.');
  321.     Choice := InputAndCheckChoice(IsCorrect);
  322.     If (Choice = 1) Then
  323.     Begin
  324.         N := InputAndCheckN(IsCorrect);
  325.         CreateMatrix(N, MyMatrix, IsCorrect);
  326.     End
  327.     Else
  328.     Begin
  329.         IsCorrect := False;
  330.         Repeat
  331.             MyFileName := RequestFileNameForReading(MyFile, IsCorrect);
  332.             IsCorrect := InputSizeFromFile(N, MyFile, IsCorrect);
  333.             If IsCorrect Then
  334.             Begin
  335.                 IsCorrect := ReadMatrix(MyFile, MyMatrix, N, IsCorrect);
  336.             End;
  337.         Until IsCorrect;
  338.     End;
  339.     Sum := SumElements(MyMatrix, N);
  340.     WriteLn('Куда Вы хотите выводить результат?', #13#10, '1 - консоль, 2 - файл.');
  341.     Choice := InputAndCheckChoice(IsCorrect);
  342.     If (Choice = 1) Then
  343.     Begin
  344.         WriteLn('Сумма равна ', Sum:8:6);
  345.     End
  346.     Else
  347.     Begin
  348.         IsCorrect := False;
  349.         Repeat
  350.             MyFileName := RequestFileNameForWriting(MyFile, IsCorrect);
  351.             IsCorrect := WriteToFile(MyFile, Sum, IsCorrect);
  352.         Until IsCorrect;
  353.     End;
  354.     ReadLn;
  355.  
  356. End.
Advertisement
Add Comment
Please, Sign In to add comment