Advertisement
MadCortez

Untitled

Oct 27th, 2020
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.29 KB | None | 0 0
  1. program laba2_3;
  2.  
  3. uses
  4.    System.SysUtils;
  5.  
  6. Type
  7.    TArray = array of array of real;
  8.    
  9. procedure PrintTask; forward;
  10. function InputValue(Min, Max: Integer): Integer; forward;
  11. procedure UserInputArrayFromConsole(n: Integer); forward;
  12. procedure UserInputFromConsole(); forward;
  13. procedure UserInputFromFile(MyFile: TextFile); forward;
  14. function CheckPath(Path: String): Boolean; forward;
  15. function UserOutputPath(): String; forward;
  16. function Gauss(Matrix: TArray):TArray; forward;
  17. procedure PrintWithoutPath(Matrix: TArray); forward;
  18. procedure PrintWithPath(Matrix: TArray); forward;
  19. function CheckFile(MyFile: TextFile): Boolean; forward;
  20. procedure UserInputPath(); forward;
  21. procedure InputMethod; forward;
  22. procedure OutputMethod(Matrix: TArray); forward;
  23.  
  24. function InputValue(Min, Max: Integer): Integer;
  25. var
  26.    CurrentValue: Integer;
  27.    IsValid: Boolean;
  28. begin
  29.    repeat
  30.    IsValid := True;
  31.    try
  32.       Read(CurrentValue);
  33.    except
  34.       begin
  35.          IsValid := False;
  36.          Writeln('Введите число');
  37.       end;
  38.    end;
  39.    if IsValid then
  40.       if (CurrentValue < Min) or (CurrentValue > Max) then
  41.       begin
  42.          IsValid := False;
  43.          Writeln('Введите число в заданном диапазоне');
  44.       end;
  45.    until IsValid;
  46.    CheckInput := CurrentValue;
  47. end;
  48.    
  49. procedure UserInputArrayFromConsole(n: Integer);
  50. var
  51.    i, j: Integer;
  52.    Matrix: TArray;
  53.    const MIN_VALUE = -500;
  54.    const MAX_VALUE = 500;
  55. begin
  56.    Writeln('Введите коэффициенты в диапазоне ', MIN_VALUE, '..', MAX_VALUE);
  57.    SetLength(Matrix, n);
  58.    for i := 0 to n - 1 do
  59.    begin
  60.       SetLength(Matrix[i], n + 1);
  61.       for j := 0 to n - 1 do
  62.          Matrix[i][j] := CheckInput(MIN_VALUE, MAX_VALUE);
  63.    end;
  64.    Readln;
  65.    Writeln('Введите свободные члены в диапазоне ', MIN_VALUE, '..', MAX_VALUE);
  66.    for i := 0 to n - 1 do
  67.      Matrix[i, n] := CheckInput(MIN_VALUE, MAX_VALUE);
  68.    Readln;
  69.    OutputMethod(Gauss(Matrix));
  70. end;
  71.  
  72. procedure UserInputFromConsole();
  73. var
  74.    n: Integer;
  75.    const MIN_SIZE = 2;
  76.    const MAX_SIZE = 20;
  77. begin
  78.    Write('Введите порядок матрицы в диапазоне ', MIN_SIZE, '..', MAX_SIZE, ': ');
  79.    N := CheckInput(MIN_SIZE, MAX_SIZE);
  80.    Readln;
  81.    UserInputArrayFromConsole(n);
  82. end;
  83.  
  84. procedure UserInputFromFile(MyFile: TextFile);
  85. var
  86.    i, j, n: Integer;
  87.    Matrix: TArray;
  88. begin
  89.    Readln(MyFile, n);
  90.    SetLength(Matrix, n);
  91.    for i := 0 to n - 1 do
  92.    begin
  93.       SetLength(Matrix[i], n + 1);
  94.       for j := 0 to n -1 do
  95.          Read(MyFile, Matrix[i, j]);
  96.    end;
  97.    for i := 0 to n - 1 do
  98.       Read(MyFile, Matrix[i, n]);
  99.    closefile(MyFile);
  100.    OutputMethod(Gauss(Matrix));
  101. end;
  102.  
  103. function CheckPath(Path: String): Boolean;
  104. begin
  105.    if FileExists(Path) then
  106.    begin
  107.       Writeln(Path, ' существует');
  108.       CheckPath := True;
  109.    end
  110.    else
  111.    begin
  112.       Writeln(Path, ' не существует');
  113.       Writeln('Введите корректный путь к файлу');
  114.    end;
  115. end;
  116.  
  117. function UserOutputPath(): String;
  118. var
  119.    Path: String;
  120. begin
  121.    Writeln('Введите абсолютный путь к файлу для вывода результата');
  122.    Readln(Path);
  123.    UserOutputPath := Path;
  124. end;
  125.  
  126. function Gauss(Matrix: TArray): TArray;
  127. var
  128.    i, j, N1, n, k: Integer;
  129.    Temp: Real;
  130. begin
  131.    n := length(Matrix);
  132.    for k := 0 to n - 1 do
  133.       for j := k + 1 to n - 1 do
  134.       begin
  135.          Temp := Matrix[j][k] / Matrix[k][k];
  136.          for i := k to n - 1 do
  137.             Matrix[j][i] := Matrix[j][i] - Temp * Matrix[k][i];
  138.          Matrix[j][n] := Matrix[j][n] - Temp * Matrix[k][n];
  139.       end;
  140.    Gauss := Matrix;
  141. end;
  142.  
  143. procedure PrintWithoutPath(Matrix: TArray);
  144. var
  145.    i, j: Integer;
  146. begin
  147.    Writeln('После «прямого хода»');
  148.    for i := 0 to Length(Matrix) - 1 do
  149.    begin
  150.       for j := 0 to Length(Matrix[i]) - 2 do
  151.          Write(Matrix[i][j], ' ');
  152.       Writeln;
  153.    end;
  154.    for i := 0 to Length(Matrix) - 1 do
  155.       Writeln(Matrix[i,Length(Matrix[i]) - 1]);
  156.    Writeln('Нажмите Enter для выхода из программы');
  157.    Readln;
  158. end;
  159.  
  160. procedure PrintWithPath(Matrix: TArray);
  161. var
  162.    i, j: Integer;
  163.    MyFile: TextFile;
  164. begin
  165.    assignfile(MyFile,UserOutputPath);
  166.    rewrite(MyFile);
  167.    for i := 0 to Length(Matrix) - 1 do
  168.    begin
  169.       for j := 0 to Length(Matrix[i]) - 1 do
  170.          Write(MyFile, Matrix[i][j], ' ');
  171.       Writeln(MyFile);
  172.    end;
  173.    close(MyFile);
  174.    Writeln('Результат работы помещён в файл');
  175. end;
  176.  
  177. function CheckFile(MyFile: TextFile): Boolean;
  178. var
  179.    IsValid: Boolean;
  180.    n, i, j: Integer;
  181.    a: real;
  182.    const MIN_SIZE = 1;
  183.    const MAX_SIZE = 20;
  184.    const MIN_VALUE = -500;
  185.    const MAX_VALUE = 500;
  186. begin
  187.    IsValid := True;
  188.    try
  189.       Read(MyFile, n);
  190.    except
  191.       IsValid := False;
  192.    end;
  193.    if IsValid then
  194.       if (n < MIN_SIZE) or (n > MAX_SIZE) then
  195.          IsValid := False;
  196.    while (IsValid) and (i < n) do
  197.    begin
  198.       inc(i);
  199.       j := 0;
  200.       while (IsValid) and (j < n) do
  201.       begin
  202.          inc(j);
  203.          try
  204.             Read(MyFile,a);
  205.          except
  206.             IsValid := False;
  207.          end;
  208.          if IsValid then
  209.             if (a < MIN_VALUE) or (a > MAX_VALUE) then
  210.                IsValid := False;
  211.       end;
  212.    end;
  213.    CheckFile := IsValid;
  214. end;
  215.  
  216. procedure UserInputPath();
  217. var
  218.    Path: String;
  219.    MyFile: TextFile;
  220. begin
  221.    repeat
  222.       repeat
  223.          Writeln('Введите абсолютный путь к файлу с входными данными');
  224.          Readln(Path);
  225.       until CheckPath(Path);
  226.       AssignFile(MyFile, path);
  227.       reset(MyFile);
  228.       if not(CheckFile(MyFile)) then
  229.          Writeln('Неккоректные данные в файле, исправьте файл');
  230.       reset(MyFile);
  231.    until (CheckFile(MyFile));
  232.    reset(MyFile);
  233.    UserInputFromFile(MyFile);
  234. end;
  235.  
  236. procedure InputMethod;
  237. var
  238.    Method: String;
  239. begin
  240.    Writeln('Каким способом хотите ввести данные?');
  241.    Writeln('1 - с помощью консоли');
  242.    Writeln('2 - с помощью файла');
  243.    repeat
  244.    Readln(Method);
  245.    case Method of
  246.    '1': UserInputFromConsole;
  247.    '2': UserInputPath;
  248.    else
  249.       Writeln('Введите корректный способ ввода');
  250.    end;
  251.    until (Method = '1') or (Method = '2');
  252. end;
  253.  
  254. procedure OutputMethod(Matrix: TArray);
  255. var
  256.    Method: String;
  257. begin
  258.    Writeln('Куда хотите вывести результат?');
  259.    Writeln('1 - в консоль');
  260.    Writeln('2 - в файл');
  261.    repeat
  262.    Readln(Method);
  263.    case Method of
  264.    '1': PrintWithoutPath(Matrix);
  265.    '2': PrintWithPath(Matrix);
  266.    else
  267.       Writeln('Введите корректный способ вывода');
  268.    end;
  269.    until (Method = '1') or (Method = '2');
  270. end;
  271.  
  272. procedure PrintTask;
  273. begin
  274.    Writeln('Данная программа выполняет «прямой ход» в решении системы линейных алгебраических уравнений методом Гаусса');
  275. end;
  276.  
  277. begin
  278.    PrintTask;  
  279.    InputMethod;
  280. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement