Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Laba_3_3;
- Uses
- System.SysUtils;
- Const
- MIN_SIZE = 2;
- MAX_SIZE = 10;
- MIN_VALUE = -1000;
- MAX_VALUE = 1000;
- Type
- TArr = Array Of Integer;
- TMatrix = Array Of Array Of Integer;
- Procedure OutputTaskInfo();
- Begin
- Writeln('Данная программа сортирует введенную последовательность методом бинарных вставок.');
- Writeln('Диапазон ввода значений размера последовательности: ', MIN_SIZE, '...', MAX_SIZE, '.');
- Writeln('Диапазон для ввода чисел: ', MIN_VALUE, '...', MAX_VALUE);
- End;
- Function InputPathToFile(): String;
- Var
- Path: String;
- IsCorrect: Boolean;
- Begin
- Write('Укажите путь к файлу: ');
- Repeat
- IsCorrect := True;
- Readln(Path);
- If Not FileExists(Path) Then
- Begin
- Write('По указанному пути файл не найден! Укажите правильный путь: ');
- IsCorrect := False;
- End
- Else If ExtractFileExt(Path) <> '.txt' Then
- Begin
- Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputPathToFile := Path;
- End;
- Function GetVerificationOfChoice(): Integer;
- Var
- Choice: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Try
- Readln(Choice);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
- Begin
- Writeln('Для выбора введите 0 или 1!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- GetVerificationOfChoice := Choice;
- End;
- Function InputSizeFromConsole(): Integer;
- Var
- Size: Integer;
- IsCorrect: Boolean;
- Begin
- Write('Введите количество элементов последовательности: ');
- Repeat
- IsCorrect := True;
- Try
- Readln(Size);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If (IsCorrect And ((Size < MIN_SIZE) Or (Size > MAX_SIZE))) Then
- Begin
- Writeln('Введите значение от ', MIN_SIZE, ' до ', MAX_SIZE, '!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputSizeFromConsole := Size;
- End;
- Function InputSizeFromFile(Const Path: String): Integer;
- Var
- Size: Integer;
- InputFile: TextFile;
- Begin
- Writeln('Происходит чтение количества членов последовательности...');
- AssignFile (InputFile, Path);
- Try
- Try
- Reset(InputFile);
- Readln(InputFile, Size);
- Finally
- CloseFile(InputFile);
- End;
- If (((Size < MIN_SIZE) Or (Size > MAX_SIZE))) Then
- Begin
- Writeln('В файле введен некорректное число! Введите количество с консоли!');
- Size := InputSizeFromConsole();
- End;
- Except
- Writeln('Ошибка при чтении данных! Введите количество с консоли!');
- Size := InputSizeFromConsole();
- End;
- InputSizeFromFile := Size;
- End;
- Procedure OutputSizeInConsole(Const Size: Integer);
- Begin
- Writeln('Количество членов последовательности: ', Size);
- End;
- Procedure OutputSizeInFile(Const Size: Integer; Path: String);
- Var
- OutputFile: TextFile;
- IsCorrect: Boolean;
- Begin
- Writeln('Вывод количества членов последовательности в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Try
- Rewrite(OutputFile);
- Write(OutputFile, Size);
- Write(OutputFile, #13);
- Finally
- Close(OutputFile);
- End;
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- Writeln('Данные успешно записаны в файл!');
- End;
- Function FillSequenceFromConsole(Const Size: Integer): TArr;
- Var
- Sequence: TArr;
- IsCorrect: Boolean;
- I: Integer;
- Begin
- SetLength(Sequence, Size);
- For I := Low(Sequence) To High(Sequence) Do
- Begin
- Write('Введите значение ', I + 1,' элемента последовательности: ');
- Repeat
- IsCorrect := True;
- Try
- Read(Sequence[I]);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If (IsCorrect And ((Sequence[I] < MIN_VALUE) Or (Sequence[I] > MAX_VALUE))) Then
- Begin
- Writeln('Введите число от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- End;
- FillSequenceFromConsole := Sequence;
- End;
- Function FillSequenceFromFile(Const Size: Integer; Const Path: String): TArr;
- Var
- Sequence: TArr;
- IsCorrect: Boolean;
- InputFile: TextFile;
- I: Integer;
- Begin
- SetLength(Sequence, Size);
- Writeln('Происходит чтение последовательности из файла...');
- AssignFile(InputFile, Path);
- Repeat
- IsCorrect := True;
- Try
- Try
- Reset(InputFile);
- Readln(InputFile);
- For I := Low(Sequence) To High(Sequence) Do
- Begin
- Read(InputFile, Sequence[I]);
- If (IsCorrect And ((Sequence[I] < MIN_VALUE) Or (Sequence[I] > MAX_VALUE))) Then
- Begin
- Writeln('Ошибка при чтении последовательности! Введите последовательность с консоли!');
- IsCorrect := False;
- Sequence := FillSequenceFromConsole(Size);
- End;
- End;
- Finally
- Close(InputFile);
- End;
- Except
- Writeln('Ошибка при чтении последовательности! Введите последовательность с консоли!');
- IsCorrect := False;
- Sequence := FillSequenceFromConsole(Size);
- End;
- Until IsCorrect;
- FillSequenceFromFile := Sequence;
- End;
- Procedure OutputSequenceInConsole(Const Sequence: TArr);
- Var
- I: Integer;
- Begin
- Writeln('Вывод начальной последовательности: ');
- For I := Low(Sequence) To High(Sequence) Do
- Write(Sequence[I], ' ');
- Write(#13#10);
- End;
- Procedure OutputSequenceInFile(Const Sequence: TArr; Path: String);
- Var
- OutputFile: TextFile;
- IsCorrect: Boolean;
- I: Integer;
- Begin
- Writeln('Вывод начальной последовательности в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Try
- Append(OutputFile);
- For I := Low(Sequence) To High(Sequence) Do
- Write(OutputFile, Sequence[I], ' ');
- Write(OutputFile, #13);
- Finally
- Close(OutputFile);
- End;
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- Writeln('Данные успешно записаны в файл!');
- End;
- Function BinaryInsertionSort(Const Sequence: TArr): TMatrix;
- Var
- I, J, Temp, Left, Right, Middle: Integer;
- NewSequence: TArr;
- DetailingMatrix: TMatrix;
- Begin
- SetLength(NewSequence, Length(Sequence));
- SetLength(DetailingMatrix, Length(Sequence), Length(Sequence));
- For I := Low(Sequence) To High(Sequence) Do
- Begin
- NewSequence[I] := Sequence [I];
- DetailingMatrix[0, I] := Sequence [I];
- End;
- For I := 1 To High(NewSequence) do
- Begin
- If NewSequence[I - 1] > NewSequence[I] then
- Begin
- Temp := NewSequence[I];
- Left := 0;
- Right := I - 1;
- Repeat
- Middle := (Left + Right) Div 2;
- If NewSequence[Middle] < Temp Then
- Left := Middle + 1
- Else
- Right := Middle - 1;
- Until Left > Right;
- For J := I - 1 Downto Left Do
- NewSequence[J + 1] := NewSequence[J];
- NewSequence[Left] := Temp;
- End;
- For J := Low(DetailingMatrix[0]) to High(DetailingMatrix[0]) do
- DetailingMatrix[I, J] := NewSequence[J];
- End;
- BinaryInsertionSort := DetailingMatrix;
- End;
- Procedure OutputDetailingMatrixInConsole(Const DetailingMatrix: TMatrix);
- Var
- I, J: Integer;
- Begin
- Writeln('Вывод пошаговой детализации: ');
- For I := Low(DetailingMatrix) To High(DetailingMatrix) Do
- Begin
- For J := Low(DetailingMatrix[0]) To High(DetailingMatrix[0]) Do
- Write(DetailingMatrix[I, J], #9);
- Writeln('');
- End;
- End;
- Procedure OutputDetailingMatrixInFile(Const DetailingMatrix: TMatrix; Path: String);
- Var
- OutputFile: TextFile;
- IsCorrect: Boolean;
- I, J: Integer;
- Begin
- Writeln('Вывод пошаговой детализации в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Try
- Append(OutputFile);
- For I := Low(DetailingMatrix) To High(DetailingMatrix) Do
- Begin
- For J := Low(DetailingMatrix[0]) To High(DetailingMatrix[0]) Do
- Write(OutputFile, DetailingMatrix[I, J], #9);
- Writeln(OutputFile,'');
- End;
- Write(OutputFile, #13);
- Finally
- Close(OutputFile);
- End;
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- Writeln('Данные успешно записаны в файл!');
- End;
- Function ProcessUserInput(): TArr;
- Var
- PathToIn: String;
- ChoiceForInput, Size: Integer;
- Sequence: TArr;
- Begin
- Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
- ChoiceForInput := GetVerificationOfChoice();
- If ChoiceForInput = 0 Then
- Begin
- Size := InputSizeFromConsole();
- Sequence := FillSequenceFromConsole(Size);
- End;
- If ChoiceForInput = 1 Then
- Begin
- PathToIn := InputPathToFile();
- Size := InputSizeFromFile(PathToIn);
- Sequence := FillSequenceFromFile(Size, PathToIn);
- End;
- ProcessUserInput := Sequence;
- End;
- Procedure ProcessUserOutput(Const Size: Integer; Const Sequence: TArr; Const DetailingMatrix: TMatrix);
- Var
- PathToOut: String;
- ChoiceForOutput: Integer;
- Begin
- Writeln('Вы желаете получть данные в консоль(0) или в файл(1)?');
- ChoiceForOutput := GetVerificationOfChoice();
- If ChoiceForOutput = 0 Then
- Begin
- OutputSizeInConsole(Size);
- OutputSequenceInConsole(Sequence);
- OutputDetailingMatrixInConsole(DetailingMatrix);
- End;
- If ChoiceForOutput = 1 Then
- Begin
- PathToOut := InputPathToFile();
- OutputSizeInFile(Size, PathToOut);
- OutputSequenceInFile(Sequence, PathToOut);
- OutputDetailingMatrixInFile(DetailingMatrix, PathToOut);
- End;
- End;
- Procedure Main();
- Var
- Sequence: TArr;
- DetailingMatrix: TMatrix;
- Begin
- OutputTaskInfo();
- Sequence := ProcessUserInput;
- DetailingMatrix := BinaryInsertionSort(Sequence);
- ProcessUserOutput(Length(Sequence), Sequence, DetailingMatrix);
- End;
- Begin
- Main();
- Readln;
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement