Advertisement
Guest User

Untitled

a guest
Oct 17th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.62 KB | None | 0 0
  1. program Project2;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils, Windows;
  7.  
  8. const
  9.    ErrorMessage = 'Ошибка! Элементы матрицы должны находится задаваться целыми числами в диапазоне [-2147483648, ..., -1, 0, 1, ..., 2147483648]';
  10.    InstructionForOrder = 'Ошибка! Порядок матрицы должен задаваться натуральным числом в диапазоне [1, ..., 2147483648]';
  11.  
  12. type
  13.    MatrixArray = array of array of Integer;
  14.  
  15.  
  16. //Функция для проверки на существование файла
  17. function IsCorrectName(): String;
  18. var
  19.    FileName: String;
  20. begin
  21.    Writeln('Пожалуйста, введите название файла в котором находится матрица. ПРИМЕР Example');
  22.    Readln(FileName);
  23.    FileName := FileName + '.txt';
  24.    if FileExists(FileName) then
  25.       IsCorrectName := FileName
  26.    else
  27.    begin
  28.       Writeln('Файла с данным названием не существует в папке в данной программой, перепроверьте название файла и введите снова четко следуя инструкциям');
  29.       IsCorrectName := '';
  30.    end;
  31. end;
  32.  
  33. //Функция для проверки на квадратную матрицу
  34. function OrderOfMatrix(var Input: TextFile): Integer; //Если квадратная возвращает порядок если нет возвращает порядок 0
  35. var
  36.    i, NumOfThisLine, Hit, Order: Integer;
  37.    SquareControl: Boolean;
  38.    Symbol: String;
  39. begin
  40.    Order := 0;
  41.    while (not SeekEOF(input)) do
  42.    begin
  43.       Readln(Input, Symbol);
  44.       inc(Order)
  45.    end;
  46.    SquareControl := False;
  47.    i := 0;
  48.    Reset(Input);
  49.    while (i < Order) do
  50.    begin
  51.       NumOfThisLine := 0;
  52.       while (not seekEOLN(Input)) do
  53.       begin
  54.          try
  55.             Read(Input, Hit);
  56.          except
  57.             Writeln(ErrorMessage);
  58.          end;
  59.          inc(NumOfThisLine);
  60.       end;
  61.       inc(i);
  62.       Readln(Input);
  63.       if (NumOfThisLine = Order) then
  64.          SquareControl := True
  65.       else
  66.       begin
  67.          Writeln('В вашей матрице нехватает элементов, пожалуйста, добавьте элементы и запустите программу снова');
  68.          i := Order + 1;
  69.          SquareControl := False
  70.       end;
  71.    end;
  72.    if SquareControl then
  73.       OrderOfMatrix := Order
  74.    else
  75.    begin
  76.          Writeln('Ваша матрица не является квадратной, кол-во строк не соответсвует кол-ву столбцов');
  77.          Writeln('Пожалуйста, исправьте это и запустите программу снова');
  78.          OrderOfMatrix := 0;
  79.    end;
  80. end;
  81.  
  82.  
  83. //Функция для заполнения массива через файл
  84. function InfFileToArray(var Input: TextFile; Order: Integer): MatrixArray;
  85. var
  86.    i, j, Iteration: Integer;
  87.    InfArray: MatrixArray;
  88. begin
  89.    Reset(Input);
  90.    SetLength(InfArray, Order, Order);
  91.    Iteration := Order - 1;
  92.    for i := 0 to Iteration do
  93.    begin
  94.       for j := 0 to Iteration do
  95.       begin
  96.          Read(Input, InfArray[i][j]);
  97.       end;
  98.       Readln(Input);
  99.    end;
  100.    InfFileToArray := InfArray;
  101. end;
  102.  
  103. //Функция для подсчета порядка матрицы (при вводе матрицы через консоль)
  104. function IsOrder(): Integer;
  105. var
  106.    Order: Integer;
  107.    IsCorrect: Boolean;
  108. begin
  109.    Writeln('Пожалуйста, введите порядок матрицы');
  110.    IsCorrect := False;
  111.    repeat
  112.       try
  113.          Readln(Order);
  114.          if (Order > 0) then
  115.             IsCorrect := True;
  116.       except
  117.          Writeln(InstructionForOrder);
  118.       end;
  119.    until IsCorrect;
  120.    IsOrder := Order;
  121. end;
  122.  
  123. //Функция для заполнения матрицы через консоль
  124. function InfConsoleToArray(Order: Integer): MatrixArray;
  125. var
  126.    i, j, Iteration: Integer;
  127.    IsCorrect: Boolean;
  128.    Matrix: MatrixArray;
  129. begin
  130.    Iteration := Order - 1;
  131.    SetLength(Matrix, Order, Order);
  132.    for i := 0 to Iteration do
  133.    begin
  134.       Writeln('Пожалуйста, введите элементы ', i + 1, ' строки');
  135.       for j := 0 to Iteration do
  136.          repeat
  137.             try
  138.                Read(Matrix[i][j]);     //если записать 5 элементов то прочитает только 4
  139.                IsCorrect := True;
  140.                if j = Iteration then
  141.                   Writeln;
  142.             except
  143.                Writeln(ErrorMessage);
  144.                IsCorrect := False;
  145.             end;
  146.          until IsCorrect;
  147.    end;
  148.    InfConsoleToArray := Matrix;
  149. end;
  150.  
  151.  
  152. //Функция для подсчета суммы согласно заданной формуле
  153. function MatrixSum(Matrix: MatrixArray; Order: Integer): Integer;
  154. var
  155.    i, Sum, j, Iteration: Integer;
  156. begin
  157.    SetLength(Matrix, Order, Order);
  158.    Iteration := Order - 1;
  159.    Sum := 0;
  160.    for i := 0 to Iteration do
  161.    begin
  162.       if (i <= Iteration - i) then
  163.          for j:= i to Iteration - i do
  164.             Sum := Sum + Matrix[i][j]
  165.       else
  166.          for j:= i downto Iteration - i do
  167.             Sum := Sum + Matrix[i][j]
  168.    end;
  169.    MatrixSum := Sum;
  170. end;
  171.  
  172. //Функция для вывода суммы в файл и в консоль
  173. procedure Output(Sum: Integer);
  174. var
  175.    Output: TextFile;
  176.    FileName: String;
  177. begin
  178.    Writeln('Пожалуйста, введите имя файла в который необходимо записать результат выполнения программы. ПРИМЕР: Example');
  179.    Readln(FileName);
  180.    FileName := FileName + '.txt';
  181.    AssignFile(Output, FileName);
  182.    Rewrite(Output);
  183.    Writeln(Output, Sum);
  184.    CloseFile(Output);
  185. end;
  186.  
  187. var
  188.   Matrix: MatrixArray;
  189.   Order, Sum: Integer;
  190.   FileName, Choise: String;
  191.   Input: TextFile;
  192.   IsCorrectChoise: Boolean;
  193. begin
  194.    SetConsoleCP(1251);
  195.    SetConsoleOutputCP(1251);
  196.    Writeln('Здравствуйте, данная программа принимает матрицу и возвращает сумму заданных в условии элементов');
  197.    Writeln('Через что вы бы хотели вводить данные?');
  198.    IsCorrectChoise := False;
  199.    repeat
  200.    Writeln('Для ввода с файла введите: F' +#13#10 +'Для ввода с консоли введите: C');
  201.    Readln(Choise);
  202.    if Choise = 'F' then
  203.    begin
  204.       FileName := IsCorrectName;
  205.       if FileName <> '' then
  206.       begin
  207.          AssignFile(Input, FileName);
  208.          Reset(Input);
  209.          Order := OrderOfMatrix(Input);
  210.          Close(Input);
  211.          if (Order <> 0) then
  212.          begin
  213.             IsCorrectChoise := True;
  214.             SetLength(Matrix, Order, Order);
  215.             Matrix := InfFileToArray(Input ,Order);
  216.          end;
  217.       end
  218.    end
  219.    else
  220.       if Choise = 'C' then
  221.       begin
  222.          IsCorrectChoise := True;
  223.          Order := IsOrder();
  224.          SetLength(Matrix, Order, Order);
  225.          Matrix := InfConsoleToArray(Order);
  226.       end
  227.       else
  228.          Writeln('Вы выбрали некорректный вариант ввода, выбирете снова четко следуя инструкциям');
  229.    until IsCorrectChoise;
  230.    Sum := MatrixSum(Matrix, Order);
  231.    Writeln('Сумма элементов матрицы по заданной формуле: ', Sum);
  232.    Output(Sum);
  233.    Readln;
  234. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement