ValeriaAVR

Lab23

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