Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Project2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- type
- TMass = array of Integer;
- procedure ReadFromFile(var Arr: TMass; var n: Integer);
- var
- FileName: String;
- IsCorrect: Boolean;
- InFile: Text;
- i: Integer;
- begin
- repeat
- Writeln('Введите имя файла, из которого хотите считать информацию: ');
- Readln(FileName);
- FileName := FileName + '.txt';
- IsCorrect := True;
- Assign(InFile, FileName);
- {$I-}
- Reset(InFile);
- {$I+}
- if IOResult <> 0 then
- begin
- Writeln('Файл не существует!');
- IsCorrect := False;
- end
- else
- begin
- Readln(InFile, n);
- if (n <= 0) then
- begin
- Writeln('Некорректный размер массива');
- IsCorrect := False;
- end
- else
- begin
- SetLength(Arr, n);
- IsCorrect := True;
- for i := 0 to High(Arr) do
- begin
- Read(InFile, Arr[i]);
- end;
- end;
- end;
- until IsCorrect;
- Close(InFile);
- end;
- procedure Input(var Arr: TMass; var n: Integer);
- var
- IsCorrect: Boolean;
- i: Integer;
- begin
- repeat
- Write('Размер массива: ');
- Readln(n);
- if (n > 0) then
- begin
- IsCorrect := True;
- SetLength(Arr, n);
- Writeln('Введите ', n, ' элементов массива');
- for i := 0 to High(Arr) do
- begin
- Read(Arr[i]);
- end;
- Readln;
- end
- else
- begin
- Writeln('Некорректный размер массива');
- IsCorrect := False;
- end;
- until IsCorrect;
- end;
- procedure Merge(var Arr: TMass; First, Last: Integer);
- var
- Middle, StartOfLeftPart, StartOfRightPart, j: Integer;
- NewArr: TMass;
- begin
- Middle := (First + Last) div 2;
- StartOfLeftPart := First;
- StartOfRightPart := Middle + 1;
- SetLength(NewArr, First + Last);
- for j := First to Last do
- if (StartOfLeftPart <= Middle) and ((StartOfRightPart >
- last) or (Arr[StartOfLeftPart] < Arr[StartOfRightPart])) then
- begin
- NewArr[j] := Arr[StartOfLeftPart];
- Inc(StartOfLeftPart);
- end
- else
- begin
- NewArr[j] := Arr[StartOfRightPart];
- Inc(StartOfRightPart);
- end;
- for j := First to Last do
- Arr[j] := NewArr[j];
- SetLength(NewArr, 0);
- end;
- procedure MergeSort(var Arr: TMass; First, Last: Integer);
- begin
- if First < Last then
- begin
- MergeSort(Arr, First, (First + Last) div 2);
- MergeSort(Arr, (First + Last) div 2 + 1, Last);
- Merge(Arr, First, Last);
- end;
- end;
- procedure Output(Arr: TMass; n: Integer);
- var
- i: Integer;
- begin
- if n = 0 then
- Writeln('Массив пуст!')
- else
- begin
- Writeln('Полученный массив');
- for i := 0 to High(Arr) do
- Write(Arr[i], ' ');
- end;
- end;
- procedure OutInFile(Arr: TMass; n: Integer);
- var
- FileName: String;
- OutFile: Text;
- i: Integer;
- begin
- Writeln;
- Writeln('Введите имя файла для записи: ');
- Readln(FileName);
- FileName := FileName + '.txt';
- Assign(OutFile, FileName);
- Rewrite(OutFile);
- if n = 0 then
- Writeln(OutFile, 'Массив пуст!')
- else
- begin
- Writeln(Outfile, 'Полученный массив');
- for i := 0 to High(Arr) do
- Write(Outfile, Arr[i], ' ');
- end;
- Close(OutFile);
- end;
- procedure Main();
- var
- n: Integer;
- Arr: TMass;
- Choose: Char;
- IsCorrect: Boolean;
- begin
- Writeln('Тема: Отсортировать массив методом двухпутевого слияния.');
- Writeln('Если хотите считать массив из файла, введите "y" или "n":');
- repeat
- Readln(Choose);
- if (Choose <> 'y') and (Choose <> 'n') then
- begin
- Writeln('Неверный ввод');
- IsCorrect := False;
- end
- else
- IsCorrect := True;
- until IsCorrect;
- case Choose of
- 'y': ReadFromFile(Arr, n);
- 'n': Input(Arr, n);
- end;
- MergeSort(Arr, 0, n - 1);
- Output(Arr, n);
- OutInFile(Arr, n);
- Readln;
- end;
- begin
- Main();
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement