Advertisement
anticlown

laba.3.3.(Delphi)

Nov 24th, 2022 (edited)
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.73 KB | None | 0 0
  1. Program Laba_3_3;
  2.  
  3. Uses
  4.   System.SysUtils;
  5. Const
  6.   MIN_SIZE = 2;
  7.   MAX_SIZE = 10;
  8.   MIN_VALUE = -1000;
  9.   MAX_VALUE = 1000;
  10. Type
  11.   TArr = Array Of Integer;
  12.   TMatrix = Array Of Array Of Integer;
  13.  
  14. Procedure OutputTaskInfo();
  15. Begin
  16.   Writeln('Данная программа сортирует введенную последовательность методом бинарных вставок.');
  17.   Writeln('Диапазон ввода значений размера последовательности: ', MIN_SIZE, '...', MAX_SIZE, '.');
  18.   Writeln('Диапазон для ввода чисел: ', MIN_VALUE, '...', MAX_VALUE);
  19. End;
  20.  
  21. Function InputPathToFile(): String;
  22. Var
  23.   Path: String;
  24.   IsCorrect: Boolean;
  25. Begin
  26.   Write('Укажите путь к файлу: ');
  27.  
  28.   Repeat
  29.     IsCorrect := True;
  30.     Readln(Path);
  31.  
  32.     If Not FileExists(Path) Then
  33.     Begin
  34.       Write('По указанному пути файл не найден! Укажите правильный путь: ');
  35.       IsCorrect := False;
  36.     End
  37.     Else If ExtractFileExt(Path) <> '.txt' Then
  38.     Begin
  39.       Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
  40.       IsCorrect := False;
  41.     End;
  42.   Until IsCorrect;
  43.  
  44.   InputPathToFile := Path;
  45. End;
  46.  
  47. Function GetVerificationOfChoice(): Integer;
  48. Var
  49.   Choice: Integer;
  50.   IsCorrect: Boolean;
  51. Begin
  52.   Repeat
  53.     IsCorrect := True;
  54.     Try
  55.       Readln(Choice);
  56.     Except
  57.       Writeln('Проверьте корректность ввода данных!');
  58.       IsCorrect := False;
  59.     End;
  60.  
  61.     If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
  62.     Begin
  63.       Writeln('Для выбора введите 0 или 1!');
  64.       IsCorrect := False;
  65.     End;
  66.  
  67.   Until IsCorrect;
  68.  
  69.   GetVerificationOfChoice := Choice;
  70. End;
  71.  
  72. Function InputSizeFromConsole(): Integer;
  73. Var
  74.   Size: Integer;
  75.   IsCorrect: Boolean;
  76. Begin
  77.   Write('Введите количество элементов последовательности: ');
  78.  
  79.   Repeat
  80.     IsCorrect := True;
  81.     Try
  82.       Readln(Size);
  83.     Except
  84.       Writeln('Проверьте корректность ввода данных!');
  85.       IsCorrect := False;
  86.     End;
  87.  
  88.     If (IsCorrect And ((Size < MIN_SIZE) Or (Size > MAX_SIZE))) Then
  89.     Begin
  90.       Writeln('Введите значение от ', MIN_SIZE, ' до ', MAX_SIZE, '!');
  91.       IsCorrect := False;
  92.     End;
  93.  
  94.   Until IsCorrect;
  95.  
  96.   InputSizeFromConsole := Size;
  97. End;
  98.  
  99. Function InputSizeFromFile(Const Path: String): Integer;
  100. Var
  101.   Size: Integer;
  102.   InputFile: TextFile;
  103. Begin
  104.   Writeln('Происходит чтение количества членов последовательности...');
  105.   AssignFile (InputFile, Path);
  106.  
  107.   Try
  108.     Try
  109.       Reset(InputFile);
  110.       Readln(InputFile, Size);
  111.     Finally
  112.       CloseFile(InputFile);
  113.     End;
  114.  
  115.     If (((Size < MIN_SIZE) Or (Size > MAX_SIZE))) Then
  116.     Begin
  117.       Writeln('В файле введен некорректное число! Введите количество с консоли!');
  118.       Size := InputSizeFromConsole();
  119.     End;
  120.   Except
  121.     Writeln('Ошибка при чтении данных! Введите количество с консоли!');
  122.     Size := InputSizeFromConsole();
  123.   End;
  124.  
  125.   InputSizeFromFile := Size;
  126. End;
  127.  
  128. Procedure OutputSizeInConsole(Const Size: Integer);
  129. Begin
  130.   Writeln('Количество членов последовательности: ', Size);
  131. End;
  132.  
  133. Procedure OutputSizeInFile(Const Size: Integer; Path: String);
  134. Var
  135.   OutputFile: TextFile;
  136.   IsCorrect: Boolean;
  137. Begin
  138.   Writeln('Вывод количества членов последовательности в файл...');
  139.  
  140.   Repeat
  141.     IsCorrect := True;
  142.     AssignFile(OutputFile, Path);
  143.  
  144.     Try
  145.       Try
  146.         Rewrite(OutputFile);
  147.         Write(OutputFile, Size);
  148.         Write(OutputFile, #13);
  149.       Finally
  150.         Close(OutputFile);
  151.       End;
  152.     Except
  153.       Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  154.       IsCorrect := False;
  155.       Path := InputPathToFile();
  156.     End;
  157.  
  158.   Until IsCorrect;
  159.  
  160.   Writeln('Данные успешно записаны в файл!');
  161. End;
  162.  
  163. Function FillSequenceFromConsole(Const Size: Integer): TArr;
  164. Var
  165.   Sequence: TArr;
  166.   IsCorrect: Boolean;
  167.   I: Integer;
  168. Begin
  169.   SetLength(Sequence, Size);
  170.  
  171.   For I := Low(Sequence) To High(Sequence) Do
  172.   Begin
  173.     Write('Введите значение ', I + 1,' элемента последовательности: ');
  174.  
  175.     Repeat
  176.       IsCorrect := True;
  177.  
  178.       Try
  179.         Read(Sequence[I]);
  180.       Except
  181.         Writeln('Проверьте корректность ввода данных!');
  182.         IsCorrect := False;
  183.       End;
  184.  
  185.       If (IsCorrect And ((Sequence[I] < MIN_VALUE) Or (Sequence[I] > MAX_VALUE))) Then
  186.       Begin
  187.         Writeln('Введите число от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
  188.         IsCorrect := False;
  189.       End;
  190.     Until IsCorrect;
  191.   End;
  192.  
  193.   FillSequenceFromConsole := Sequence;
  194. End;
  195.  
  196. Function FillSequenceFromFile(Const Size: Integer; Const Path: String): TArr;
  197. Var
  198.   Sequence: TArr;
  199.   IsCorrect: Boolean;
  200.   InputFile: TextFile;
  201.   I: Integer;
  202. Begin
  203.   SetLength(Sequence, Size);
  204.   Writeln('Происходит чтение последовательности из файла...');
  205.   AssignFile(InputFile, Path);
  206.  
  207.   Repeat
  208.     IsCorrect := True;
  209.  
  210.     Try
  211.       Try
  212.         Reset(InputFile);
  213.         Readln(InputFile);
  214.  
  215.         For I := Low(Sequence) To High(Sequence) Do
  216.         Begin
  217.           Read(InputFile, Sequence[I]);
  218.  
  219.           If (IsCorrect And ((Sequence[I] < MIN_VALUE) Or (Sequence[I] > MAX_VALUE))) Then
  220.             Begin
  221.               Writeln('Ошибка при чтении последовательности! Введите последовательность с консоли!');
  222.               IsCorrect := False;
  223.               Sequence := FillSequenceFromConsole(Size);
  224.             End;
  225.         End;
  226.       Finally
  227.         Close(InputFile);
  228.       End;
  229.     Except
  230.       Writeln('Ошибка при чтении последовательности! Введите последовательность с консоли!');
  231.       IsCorrect := False;
  232.       Sequence := FillSequenceFromConsole(Size);
  233.     End;
  234.   Until IsCorrect;
  235.  
  236.   FillSequenceFromFile := Sequence;
  237. End;
  238.  
  239. Procedure OutputSequenceInConsole(Const Sequence: TArr);
  240. Var
  241.   I: Integer;
  242. Begin
  243.   Writeln('Вывод начальной последовательности: ');
  244.  
  245.   For I := Low(Sequence) To High(Sequence) Do
  246.     Write(Sequence[I], ' ');
  247.   Write(#13#10);
  248. End;
  249.  
  250. Procedure OutputSequenceInFile(Const Sequence: TArr; Path: String);
  251. Var
  252.   OutputFile: TextFile;
  253.   IsCorrect: Boolean;
  254.   I: Integer;
  255. Begin
  256.   Writeln('Вывод начальной последовательности в файл...');
  257.  
  258.   Repeat
  259.     IsCorrect := True;
  260.     AssignFile(OutputFile, Path);
  261.  
  262.     Try
  263.       Try
  264.         Append(OutputFile);
  265.  
  266.         For I := Low(Sequence) To High(Sequence) Do
  267.           Write(OutputFile, Sequence[I], ' ');
  268.         Write(OutputFile, #13);
  269.       Finally
  270.         Close(OutputFile);
  271.       End;
  272.     Except
  273.       Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  274.       IsCorrect := False;
  275.       Path := InputPathToFile();
  276.     End;
  277.  
  278.   Until IsCorrect;
  279.  
  280.   Writeln('Данные успешно записаны в файл!');
  281. End;
  282.  
  283. Function BinaryInsertionSort(Const Sequence: TArr): TMatrix;
  284. Var
  285.   I, J, Temp, Left, Right, Middle: Integer;
  286.   NewSequence: TArr;
  287.   DetailingMatrix: TMatrix;
  288. Begin
  289.   SetLength(NewSequence, Length(Sequence));
  290.   SetLength(DetailingMatrix, Length(Sequence), Length(Sequence));
  291.  
  292.   For I := Low(Sequence) To High(Sequence) Do
  293.   Begin
  294.     NewSequence[I] := Sequence [I];
  295.     DetailingMatrix[0, I] := Sequence [I];
  296.   End;
  297.  
  298.   For I := 1 To High(NewSequence) do
  299.   Begin
  300.     If NewSequence[I - 1] > NewSequence[I] then
  301.     Begin
  302.       Temp := NewSequence[I];
  303.       Left := 0;
  304.       Right := I - 1;
  305.  
  306.       Repeat
  307.         Middle := (Left + Right) Div 2;
  308.  
  309.         If NewSequence[Middle] < Temp Then
  310.           Left := Middle + 1
  311.         Else
  312.           Right := Middle - 1;
  313.       Until Left > Right;
  314.  
  315.       For J := I - 1 Downto Left Do
  316.         NewSequence[J + 1] := NewSequence[J];
  317.       NewSequence[Left] := Temp;
  318.     End;
  319.  
  320.     For J := Low(DetailingMatrix[0]) to High(DetailingMatrix[0]) do
  321.       DetailingMatrix[I, J] := NewSequence[J];
  322.   End;
  323.  
  324.   BinaryInsertionSort := DetailingMatrix;
  325. End;
  326.  
  327. Procedure OutputDetailingMatrixInConsole(Const DetailingMatrix: TMatrix);
  328. Var
  329.   I, J: Integer;
  330. Begin
  331.   Writeln('Вывод пошаговой детализации: ');
  332.  
  333.   For I := Low(DetailingMatrix) To High(DetailingMatrix) Do
  334.   Begin
  335.     For J := Low(DetailingMatrix[0]) To High(DetailingMatrix[0]) Do
  336.       Write(DetailingMatrix[I, J], #9);
  337.     Writeln('');
  338.   End;
  339. End;
  340.  
  341. Procedure OutputDetailingMatrixInFile(Const DetailingMatrix: TMatrix; Path: String);
  342. Var
  343.   OutputFile: TextFile;
  344.   IsCorrect: Boolean;
  345.   I, J: Integer;
  346. Begin
  347.   Writeln('Вывод пошаговой детализации в файл...');
  348.  
  349.   Repeat
  350.     IsCorrect := True;
  351.     AssignFile(OutputFile, Path);
  352.  
  353.     Try
  354.       Try
  355.         Append(OutputFile);
  356.  
  357.         For I := Low(DetailingMatrix) To High(DetailingMatrix) Do
  358.         Begin
  359.           For J := Low(DetailingMatrix[0]) To High(DetailingMatrix[0]) Do
  360.             Write(OutputFile, DetailingMatrix[I, J], #9);
  361.           Writeln(OutputFile,'');
  362.         End;
  363.         Write(OutputFile, #13);
  364.       Finally
  365.         Close(OutputFile);
  366.       End;
  367.     Except
  368.       Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  369.       IsCorrect := False;
  370.       Path := InputPathToFile();
  371.     End;
  372.  
  373.   Until IsCorrect;
  374.  
  375.   Writeln('Данные успешно записаны в файл!');
  376. End;
  377.  
  378. Function ProcessUserInput(): TArr;
  379. Var
  380.   PathToIn: String;
  381.   ChoiceForInput, Size: Integer;
  382.   Sequence: TArr;
  383. Begin
  384.   Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
  385.   ChoiceForInput := GetVerificationOfChoice();
  386.  
  387.   If ChoiceForInput = 0 Then
  388.   Begin
  389.     Size := InputSizeFromConsole();
  390.     Sequence := FillSequenceFromConsole(Size);
  391.   End;
  392.  
  393.   If ChoiceForInput = 1 Then
  394.   Begin
  395.     PathToIn := InputPathToFile();
  396.     Size := InputSizeFromFile(PathToIn);
  397.     Sequence := FillSequenceFromFile(Size, PathToIn);
  398.   End;
  399.  
  400.   ProcessUserInput := Sequence;
  401. End;
  402.  
  403. Procedure ProcessUserOutput(Const Size: Integer; Const Sequence: TArr; Const DetailingMatrix: TMatrix);
  404. Var
  405.   PathToOut: String;
  406.   ChoiceForOutput: Integer;
  407. Begin
  408.   Writeln('Вы желаете получть данные в консоль(0) или в файл(1)?');
  409.   ChoiceForOutput := GetVerificationOfChoice();
  410.  
  411.   If ChoiceForOutput = 0 Then
  412.   Begin
  413.     OutputSizeInConsole(Size);
  414.     OutputSequenceInConsole(Sequence);
  415.     OutputDetailingMatrixInConsole(DetailingMatrix);
  416.   End;
  417.  
  418.   If ChoiceForOutput = 1 Then
  419.   Begin
  420.     PathToOut := InputPathToFile();
  421.     OutputSizeInFile(Size, PathToOut);
  422.     OutputSequenceInFile(Sequence, PathToOut);
  423.     OutputDetailingMatrixInFile(DetailingMatrix, PathToOut);
  424.   End;
  425. End;
  426.  
  427. Procedure Main();
  428. Var
  429.   Sequence: TArr;
  430.   DetailingMatrix: TMatrix;
  431. Begin
  432.   OutputTaskInfo();
  433.   Sequence := ProcessUserInput;
  434.   DetailingMatrix := BinaryInsertionSort(Sequence);
  435.   ProcessUserOutput(Length(Sequence), Sequence, DetailingMatrix);
  436. End;
  437.  
  438. Begin
  439.   Main();
  440.   Readln;
  441.   Readln;
  442. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement