Advertisement
RevolutIIon

Untitled

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