Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program LabWork;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,
- Windows;
- type
- MatrixArray = array of array of Integer;
- const
- ErrorMessage = 'Ошибка! Элементы матрицы должны находится задаваться целыми числами в диапазоне [-2147483648, ..., -1, 0, 1, ..., 2147483648]';
- InstructionForOrder = 'Ошибка! Порядок матрицы должен задаваться натуральным числом в диапазоне [2, ..., 2147483648]';
- //Функция для проверки ввода пользователя
- function FileOrConsole(): Char;
- var
- IsCorrect: Boolean;
- Choise: Char;
- begin
- IsCorrect := False;
- repeat
- Writeln('Если хотите вводить информацию через файл напишите: F' +#13#10 +'Если хотите вводить информацию через консоль напишите: C');
- Readln(Choise);
- if (Choise = 'F') or (Choise = 'C') then
- begin
- IsCorrect := True;
- FileOrConsole := Choise;
- end
- else
- Writeln('Вы ввели невозможное значение выбора, пожалуйста, введите значение заново четко следуя инструкциям');
- until IsCorrect;
- end;
- //Функция для проверки на существование файла
- function IsCorrectName(): String;
- var
- FileName: String;
- IsCorrect: Boolean;
- begin
- Writeln('Пожалуйста, введите название файла(и формат) или путь к этому файлу.');
- IsCorrect := False;
- repeat
- Readln(FileName);
- if FileExists(FileName) then
- begin
- IsCorrect := True;
- IsCorrectName := FileName;
- end
- else
- Writeln('Файла с данным названием не существует, перепроверьте название файла и введите снова четко следуя инструкциям');
- until IsCorrect;
- end;
- //Функция для проверки на квадратную матрицу Если квадратная возвращает порядок если нет возвращает порядок 0
- function OrderOfMatrixFile(var Input: TextFile): Integer;
- var
- i, NumOfThisLine, Hit, Order: Integer;
- SquareControl: Boolean;
- Symbol: String;
- begin
- Order := 0;
- while (not SeekEOF(input)) do
- begin
- Readln(Input, Symbol);
- inc(Order)
- end;
- SquareControl := False;
- if Order < 2 then
- Writeln('Ошибка. Минимальный порядок матрицы: 2, пожалуйста, исправьте это и запустите программу снова.')
- else
- begin
- i := 0;
- Reset(Input);
- while (i < Order) do
- begin
- NumOfThisLine := 0;
- while (not seekEOLN(Input)) do
- begin
- try
- Read(Input, Hit);
- except
- Writeln(ErrorMessage);
- Writeln('Пожалуйста исправьте это и запустите программу снова.')
- end;
- inc(NumOfThisLine);
- end;
- inc(i);
- Readln(Input);
- if (NumOfThisLine = Order) then
- SquareControl := True
- else
- begin
- Writeln('В вашей матрице нехватает элементов, пожалуйста, добавьте элементы и запустите программу снова');
- i := Order;
- SquareControl := False
- end;
- end;
- end;
- if SquareControl then
- OrderOfMatrixFile := Order
- else
- OrderOfMatrixFile := 0;
- end;
- //Функция для заполнения массива через файл
- function InfFileToArray(var Input: TextFile; Order: Integer): MatrixArray;
- var
- i, j, Iteration: Integer;
- InfArray: MatrixArray;
- begin
- Reset(Input);
- Iteration := Order - 1;
- SetLength(InfArray, Order, Order);
- for i := 0 to Iteration do
- begin
- for j := 0 to Iteration do
- begin
- Read(Input, InfArray[i][j]);
- end;
- Readln(Input);
- end;
- InfFileToArray := InfArray;
- end;
- //Функция для подсчета порядка матрицы (при вводе матрицы через консоль)
- function OrderOfMatrixConsole(): Integer;
- var
- Order: Integer;
- IsCorrect: Boolean;
- begin
- IsCorrect := False;
- repeat
- Writeln('Пожалуйста, введите порядок матрицы');
- try
- Readln(Order);
- if (Order > 1) then
- IsCorrect := True
- else
- Writeln(InstructionForOrder);
- except
- Writeln(InstructionForOrder);
- end;
- until IsCorrect;
- OrderOfMatrixConsole := Order;
- end;
- //Функция для заполнения матрицы через консоль
- function InfConsoleToArray(Order: Integer): MatrixArray;
- var
- i, j, Iteration: Integer;
- IsCorrect: Boolean;
- Matrix: MatrixArray;
- begin
- Iteration := Order - 1;
- SetLength(Matrix, Order, Order);
- Writeln('Пожалуйста, введите элементы матрицы [№строки, №столбца]');
- for i := 0 to Iteration do
- for j := 0 to Iteration do
- repeat
- try
- Write('[', i+1, '][', j+1, ']: ');
- Readln(Matrix[i][j]);
- IsCorrect := True;
- except
- Writeln(ErrorMessage);
- IsCorrect := False;
- end;
- until IsCorrect;
- InfConsoleToArray := Matrix;
- end;
- //Функция для подсчета максимальной суммы элементов
- function MaxElementsSum(var Coordinates: String; Matrix: MatrixArray; Order: Integer): Integer;
- var
- i, j, MaxSum, Iteration, Sum: Integer;
- begin
- Iteration := Order - 1;
- MaxSum := Low(Integer);
- for i:=0 to Iteration do
- for j:=0 to Iteration do
- begin
- if (j+1) < Order then
- begin
- Sum := Matrix[i][j] + Matrix[i][j+1];
- if Sum > MaxSum then
- begin
- MaxSum := Sum;
- Coordinates := Format('[%d %d][%d %d]', [i + 1, j + 1, i + 1, j + 2]);
- end
- else // Нужно чтобы не записывать первый элемент два раза
- if Sum = MaxSum then
- Coordinates := Coordinates + Format(', [%d %d][%d %d]', [i + 1, j + 1, i + 1, j + 2]);
- end;
- if (i+1) < Order then
- begin
- Sum := Matrix[i][j] + Matrix[i+1][j];
- if Sum > MaxSum then
- begin
- MaxSum := Sum;
- Coordinates := Format('[%d %d][%d %d]', [i + 1, j + 1, i + 2, j + 1]);
- end
- else // Нужно чтобы не записывать первый элемент два раза
- if Sum = MaxSum then
- Coordinates := Coordinates + Format(', [%d %d][%d %d]', [i + 1, j + 1, i + 2, j + 1]);
- end;
- end;
- MaxElementsSum := MaxSum;
- end;
- //Функция для вывода суммы в файл и в консоль
- procedure Output(Sum: Integer; var Coordinates: String);
- var
- Output: TextFile;
- FileName: String;
- begin
- Write('Наибольшая сумма соседних элементов матрицы: ', Sum, #13#10, 'При элементах равных ' + #13#10);
- Writeln(Coordinates);
- Writeln('Пожалуйста, введите имя файла(и формат), в который необходимо записать результат выполнения программы.');
- Readln(FileName);
- AssignFile(Output, FileName);
- Rewrite(Output);
- Write(Output, 'Наибольшая сумма соседних элементов матрицы: ', Sum, #13#10, 'При элементах равных');
- Writeln(Output, Coordinates);
- CloseFile(Output);
- Writeln('Информация успешно записана в файл.');
- end;
- var
- Matrix: MatrixArray;
- Order, Sum: Integer;
- FileName, Coordinates: String;
- Input: TextFile;
- Choise: Char;
- begin
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- Writeln('Здравствуйте, данная программа находит наибольшую сумму, образованную двумя соседними элементами.'+#13#10+'Соседями
- считаются элементы справа, слева, сверху и снизу.');
- Writeln('Через что вы бы хотели вводить данные?');
- Choise := FileOrConsole;
- if Choise = 'F' then
- begin
- FileName := IsCorrectName;
- AssignFile(Input, FileName);
- Reset(Input);
- Order := OrderOfMatrixFile(Input);
- Close(Input);
- if (Order <> 0) then
- begin
- SetLength(Matrix, Order, Order);
- Matrix := InfFileToArray(Input, Order);
- end;
- end
- else
- if Choise = 'C' then
- begin
- Order := OrderOfMatrixConsole;
- SetLength(Matrix, Order, Order);
- Matrix := InfConsoleToArray(Order);
- end;
- if Order <> 0 then
- begin
- Coordinates := '';
- Sum := MaxElementsSum(Coordinates, Matrix, Order);
- Output(Sum, Coordinates);
- end;
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement