Advertisement
believe_me

Untitled

Nov 29th, 2021
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 21.29 KB | None | 0 0
  1. program lab33;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. uses
  7.     System.SysUtils;
  8.  
  9. type
  10.     TArray = array of Integer;
  11.  
  12. Function CheckExtension(Path: String): Boolean; forward;
  13.  
  14. Function InputIntegerNumber(MinNumber, MaxNumber: Integer): Integer;
  15.  
  16. var
  17.     IsCorrect: Boolean;
  18.     Number: Integer;
  19.  
  20. begin
  21.     repeat
  22.         IsCorrect := true;
  23.         try
  24.             Readln(Number);
  25.         except
  26.             Writeln('Нужно ввести целое число, которое не меньше ', MinNumber,
  27.                     ' и не больше ', MaxNumber);
  28.             IsCorrect := false;
  29.         end;
  30.         if IsCorrect and ((Number < MinNumber) or (Number > MaxNumber)) then
  31.         begin
  32.             Writeln('Нужно ввести целое число, которое не меньше ', MinNumber,
  33.                     ' и не больше ', MaxNumber);
  34.             IsCorrect := false;
  35.         end;
  36.     until IsCorrect;
  37.     InputIntegerNumber := Number;
  38. end;
  39.  
  40. Function ChooseWayOfInput(): Integer;
  41.  
  42. const
  43.     CONSOLE_WAY = 1;
  44.     FILE_WAY = 2;
  45.     RANDOM_GENERATION_INPUT = 3;
  46.  
  47. var
  48.     UserWay: Integer;
  49.  
  50. begin
  51.     Repeat
  52.         UserWay := InputIntegerNumber(1, 3);
  53.     Until (UserWay = CONSOLE_WAY) or (UserWay = FILE_WAY) or (UserWay = RANDOM_GENERATION_INPUT);
  54.     ChooseWayOfInput := UserWay;
  55. end;
  56.  
  57. Function ChooseWayOfOutput(): Integer;
  58.  
  59. const
  60.     CONSOLE_WAY = 1;
  61.     FILE_WAY = 2;
  62.  
  63. var
  64.     UserWay: Integer;
  65.  
  66. begin
  67.     Repeat
  68.         UserWay := InputIntegerNumber(1, 2);
  69.     Until (UserWay = CONSOLE_WAY) or (UserWay = FILE_WAY);
  70.     ChooseWayOfOutput := UserWay;
  71. end;
  72.  
  73. Function InputPathToFile(): String;
  74.  
  75. var
  76.     Path: String;
  77.     IsCorrect: Boolean;
  78.     NewFile: TextFile;
  79. begin
  80.     Writeln('Input path to file:');
  81.     repeat
  82.         Readln(Path);
  83.         IsCorrect := CheckExtension(Path);
  84.     until IsCorrect;
  85.     InputPathToFile := Path;
  86. end;
  87.  
  88. Function CheckPermissionForReading(Path: String): Boolean;
  89.  
  90. var
  91.     OutputFile: TextFile;
  92.     RightPermission: Boolean;
  93.  
  94. begin
  95.     Assign(OutputFile, Path);
  96.     RightPermission := true;
  97.     try
  98.         Reset(OutputFile);
  99.         Close(OutputFile);
  100.     except
  101.         Writeln('File is not available for reading.');
  102.         RightPermission := false;
  103.     end;
  104.     CheckPermissionForReading := RightPermission;
  105. end;
  106.  
  107. Function ReceiveNumberOfElementsFromConsole(): Integer;
  108.  
  109. var
  110.     NumberOfElements: Integer;
  111.     Text: String;
  112.  
  113. begin
  114.     Writeln('Input number of elements: ');
  115.     NumberOfElements := InputIntegerNumber(2, 200);
  116.     ReceiveNumberOfElementsFromConsole := NumberOfElements;
  117. end;
  118.  
  119. Function CheckFile(PathToFile: string): Boolean;
  120.  
  121. var
  122.     IsCorrect, Flag: Boolean;
  123.     EndNumber, i: Integer;
  124.     InputFile: TextFile;
  125.     Text: String;
  126.  
  127. begin
  128.     Assign(InputFile, PathToFile);
  129.     Reset(InputFile);
  130.     Read(InputFile, Text);
  131.     Flag:= true;
  132.     IsCorrect:= false;
  133.     EndNumber:= Length(Text) + 1;
  134.     i:= 1;
  135.     while (i < EndNumber) and Flag do
  136.     begin;
  137.         if (Text[i] <> ' ') and (Text[i] <> '-') then
  138.             try
  139.                 StrToInt(copy(Text, i, 1));
  140.             except
  141.                 Writeln('Received data includes non-integer chars.');
  142.                 Flag := false;
  143.             end;
  144.         Inc(i);
  145.     end;
  146.     Close(InputFile);
  147.     if flag and (Text = '') then
  148.     begin
  149.         Flag := false;
  150.         Writeln('File is empty');
  151.     end;
  152.     CheckFile := flag;
  153. end;
  154.  
  155. Function ReceiveNumberOfElementsFromFile(PathToFile: String): Integer;
  156.  
  157. var
  158.     InputFile: TextFile;
  159.     ELement, NumberOfElements: Integer;
  160.  
  161. begin;
  162.     NumberOfElements := 0;
  163.     Assign(InputFile, PathToFile);
  164.     Reset(InputFile);
  165.     while (not EOF(InputFile)) do
  166.     begin
  167.         Read(InputFile, Element);
  168.         Inc(NumberOfElements);
  169.     end;
  170.     Close(InputFile);
  171.     ReceiveNumberOfElementsFromFile := NumberOfElements;
  172. end;
  173.  
  174. Function ReceiveNumberOfElements(var UserWay: Integer; var PathToFile: string): Integer;
  175.  
  176. const
  177.     CONSOLE_WAY = 1;
  178.     FILE_WAY = 2;
  179.     RANDOM_GENERATION_WAY = 3;
  180.  
  181. var
  182.     NumberOfElements: Integer;
  183.     IsTextCorrect: Boolean;
  184.     IsCorrect: Boolean;
  185.  
  186. begin;
  187.     IsTextCorrect := true;
  188.     Writeln('Choose way of input:'#13#10'Type "1" if you want to receive sequence from console;'#13#10'Type "2" if you want to receieve sequence from file;'#13#10'Type "3" if you want to fill sequence with random numbers:');
  189.     UserWay := ChooseWayOfInput();
  190.     case UserWay of
  191.         CONSOLE_WAY:
  192.             begin
  193.                 NumberOfElements := ReceiveNumberOfElementsFromConsole();
  194.             end;
  195.         FILE_WAY:
  196.             begin
  197.                 repeat
  198.                     PathToFile := InputPathToFile();
  199.                 until CheckPermissionForReading(PathToFile) and CheckFile(PathToFile);
  200.                 NumberOfElements := ReceiveNumberOfElementsFromFile(PathToFile);
  201.             end;
  202.         RANDOM_GENERATION_WAY:
  203.             begin
  204.                 NumberOfElements := ReceiveNumberOfElementsFromConsole();
  205.             end;
  206.     end;
  207.     if not IsTextCorrect then
  208.         Writeln('There are no reqired elements.');
  209.     ReceiveNumberOfElements := NumberOfElements;
  210. end;
  211.  
  212. Procedure FillingSourceArrayFromConsole(var SourceArray: array of Integer);
  213.  
  214. var
  215.     i, EndNumber: Integer;
  216.  
  217. begin;
  218.     EndNumber:= length(SourceArray) - 1;
  219.     for i := 0 to EndNumber do
  220.     begin
  221.         Writeln('Input element: ');
  222.         SourceArray[i] := InputIntegerNumber(-50, 50);
  223.     end;
  224. end;
  225.  
  226. Procedure FillSourceArrayWithRandomNumbers(var SourceArray: array of Integer);
  227.  
  228. var
  229.     i, EndNumber: Integer;
  230.  
  231. begin
  232.     Randomize;
  233.     EndNumber := Length(SourceArray) - 1;
  234.     for i:= 0 to EndNumber do
  235.         SourceArray[i] := Random(101) - 50;
  236. end;
  237.  
  238. Procedure ReceieveSourceArrayFromFile(var SourceArray: array of Integer; PathToFile: string);
  239.  
  240. var
  241.     i, EndNumber: Integer;
  242.     InputFile: TextFile;
  243.  
  244. begin
  245.     Assign(InputFile, PathToFile);
  246.     Reset(InputFile);
  247.     i:= 0;
  248.     EndNumber := Length(SourceArray);
  249.     while (not EOF(InputFile)) and (i < EndNumber) do
  250.     begin
  251.         Read(InputFile, SourceArray[i]);
  252.         Inc(i);
  253.     end;
  254. end;
  255.  
  256. Procedure ReceiveSourceArray(var SourceArray: array of Integer; NumberOfElements: Integer; UserWay: Integer; PathToFile: string);
  257.  
  258. const
  259.     CONSOLE_WAY = 1;
  260.     FILE_WAY = 2;
  261.     RANDOM_GENERATION_FAY = 3;
  262.  
  263. var
  264.     i, EndNumber: Integer;
  265.  
  266.  
  267. begin
  268.     case UserWay of
  269.         CONSOLE_WAY:
  270.             begin
  271.                 FillingSourceArrayFromConsole(SourceArray);
  272.             end;
  273.         FILE_WAY:
  274.             begin
  275.                 ReceieveSourceArrayFromFile(SourceArray, PathToFile);
  276.             end;
  277.         RANDOM_GENERATION_FAY:
  278.             begin
  279.                 FillSourceArrayWithRandomNumbers(SourceArray);
  280.             end;
  281.     end;
  282.     EndNumber:= Length(SourceArray) - 1;
  283.     Writeln('Source array:');
  284.     for i := 0 to EndNumber do
  285.         Write(SourceArray[i]:3,' ');
  286.     Writeln('');
  287. end;
  288.  
  289. Function CheckExtension(Path: String): Boolean;
  290.  
  291. var
  292.     RigthExtension: Boolean;
  293.  
  294. begin
  295.     if (ExtractFileExt(Path) = '.txt') then
  296.         RigthExtension := true
  297.     else
  298.     begin
  299.         Writeln('Wrong file extension.');
  300.         RigthExtension := false;
  301.     end;
  302.     CheckExtension := RigthExtension;
  303. end;
  304.  
  305. Function CheckPermissionForWriting(Path: String): Boolean;
  306.  
  307. var
  308.     OutputFile: TextFile;
  309.     RightPermission: Boolean;
  310.  
  311. begin
  312.     Assign(OutputFile, Path);
  313.     RightPermission := true;
  314.     try
  315.         Rewrite(OutputFile);
  316.         Close(OutputFile);
  317.     except
  318.         Writeln('File is not available for writing.');
  319.         RightPermission := false;
  320.     end;
  321.     CheckPermissionForWriting := RightPermission;
  322. end;
  323.  
  324. Procedure PrintResultToFile(Path: String; SortedArray: array of Integer);
  325.  
  326. var
  327.     OutputFile: TextFile;
  328.     i, EndNumber: Integer;
  329.  
  330. begin
  331.     Assign(OutputFile, Path);
  332.     Append(OutputFile);
  333.     Write(OutputFile, 'Sorted array: ');
  334.     EndNumber := Length(SortedArray) - 1;
  335.     for i := 0 to EndNumber do
  336.             Write(OutputFile, SortedArray[i]:3, ' ');
  337.     Close(OutputFile);
  338.     Writeln('Result is writen in file.');
  339. end;
  340.  
  341. Procedure PrintResultInConsole(SortedArray: array of Integer);
  342.  
  343. var
  344.     i, EndNumber: Integer;
  345.  
  346. begin;
  347.     Writeln('Sorted array: ');
  348.     EndNumber := Length(SortedArray) - 1;
  349.     for i := 0 to EndNumber do
  350.        Write(SortedArray[i]:3, ' ');
  351. end;
  352.  
  353. Procedure PrintResult(SortedArray: array of Integer; var UserWay: Integer; var PathToFile: string);
  354.  
  355. const
  356.     CONSOLE_WAY = 1;
  357.     FILE_WAY = 2;
  358.  
  359. begin;
  360.     case UserWay of
  361.         CONSOLE_WAY:
  362.             begin
  363.                 PrintResultInConsole(SortedArray);
  364.             end;
  365.         FILE_WAY:
  366.             begin
  367.                 PrintResultToFile(PathToFile, SortedArray);
  368.             end;
  369.     end;
  370.     Writeln('Program is completed.');
  371. end;
  372.  
  373. Procedure FillingArrayWithZeros(var SizesOfIntermediateArray: array of Integer);
  374.  
  375. var
  376.     Counter, i, NumberOfElements, EndNumber: Integer;
  377.  
  378. begin
  379.     NumberofElements:= length(SizesOfIntermediateArray);
  380.     Counter := NumberOfElements mod 2;
  381.     for i := 0 to Counter do
  382.         SizesOfIntermediateArray[i] := 0;
  383. end;
  384.  
  385. Function FindPositionToWriteSizesOfFirstSortingArray(var SizesOfFirstSortingArray: array of Integer; NumberOfElements: Integer): Integer;
  386.  
  387. var
  388.     i, Index: Integer;
  389.     IsCorrect: Boolean;
  390.  
  391. begin
  392.     i:= 0;
  393.     Index:= 0;
  394.     IsCorrect:= true;
  395.     while (i <  NumberOfElements) and IsCorrect do
  396.     begin
  397.         if (SizesOfFirstSortingArray[i] = 0) then
  398.         begin
  399.            IsCorrect:= false;
  400.            Index:= i;
  401.         end;
  402.         Inc(i);
  403.     end;
  404.     FindPositionToWriteSizesOfFirstSortingArray := Index;
  405. end;
  406.  
  407. Function FindPositionToWriteSizesOfSecondSortingArray(var SizesOfSecondSortingArray: array of Integer; NumberOfElements: Integer): Integer;
  408.  
  409. var
  410.     i, Index: Integer;
  411.     IsCorrect: Boolean;
  412.  
  413. begin
  414.     i:= 0;
  415.     Index:= 0;
  416.     IsCorrect:= true;
  417.     while (i <  NumberOfElements) and IsCorrect do
  418.     begin
  419.         if (SizesOfSecondSortingArray[i] = 0) then
  420.         begin
  421.            IsCorrect:= false;
  422.            Index:= i;
  423.         end;
  424.         Inc(i);
  425.     end;
  426.     FindPositionToWriteSizesOfSecondSortingArray := Index;
  427. end;
  428.  
  429. Function FindConditionOfSorted(var IntermediateArray: array of Integer) : Boolean;
  430.  
  431. var
  432.     Counter, i, EndNumber: Integer;
  433.     Flag: Boolean;
  434.  
  435. begin
  436.     Counter:= 0;
  437.     EndNumber:= Length(IntermediateArray) - 1;
  438.     for i := 1 to EndNumber do
  439.     begin;
  440.         if (IntermediateArray[i - 1] <= IntermediateArray[i]) then
  441.         begin
  442.             Inc(Counter);
  443.         end;
  444.     end;
  445.     if (Counter = EndNumber) then
  446.         Flag:= true
  447.     else
  448.         Flag:= false;
  449.     FindConditionOfSorted :=  Flag;
  450. end;
  451.  
  452. Procedure CreatingFirstF(var IntermediateArray, SourceArray: array of Integer);
  453.  
  454. var
  455.     EndNumber, i: Integer;
  456.  
  457. begin
  458.     EndNumber:= Length(SourceArray) - 1;
  459.     for i:= 0 to EndNumber do
  460.        IntermediateArray[i]:= SourceArray[i];
  461. end;
  462.  
  463. Procedure CreatingSortedArray(var SortedArray: array of Integer; var IntermediateArray: array of Integer);
  464.  
  465. var
  466.     EndNumber, i: Integer;
  467.  
  468. begin
  469.     EndNumber:= Length(IntermediateArray) - 1;
  470.     for i:= 0 to EndNumber do
  471.        SortedArray[i]:= IntermediateArray[i];
  472. end;
  473.  
  474. Function FindNumberOfPairs(var SizesOfFirstSortingArray: array of Integer; NumberOfElements: Integer): Integer;
  475.  
  476. var
  477.     Counter, i, NullPosition: Integer;
  478.  
  479. begin
  480.     i:= 0;
  481.     Counter:= NumberOfElements div 2 + 1;
  482.     NullPosition := Counter;
  483.     while i < Counter do
  484.     begin
  485.         if (SizesOfFirstSortingArray[i] = 0) then
  486.         begin
  487.             NullPosition := i;
  488.             i := Counter;
  489.         end;
  490.         Inc(i);
  491.     end;
  492.     FindNumberOfPairs := NullPosition;
  493. end;
  494.  
  495. Procedure FindSortedPart(var IntermediateArray: array of Integer; var Sort: array of Integer; NumberOfElements: Integer; var Index: Integer; var Length: Integer);
  496.  
  497. var
  498.     k, i, j: Integer;
  499.  
  500. begin
  501.     k := 0;
  502.     i := Index;
  503.     while (i < NumberOfElements) do
  504.      begin
  505.         if (i + 1 < NumberOfElements) then
  506.         begin
  507.             if (IntermediateArray[i] <= IntermediateArray[i + 1]) then
  508.                 Inc(k)
  509.             else
  510.                 i := NumberOfElements;
  511.         end;
  512.         Inc(i);
  513.      end;
  514.     if (k > 0) then
  515.     begin
  516.         j := 0;
  517.         for i := Index to Index + k do
  518.         begin
  519.             sort[j] := IntermediateArray[i];
  520.             Inc(j);
  521.         end;
  522.     end
  523.     else
  524.         sort[0] := IntermediateArray[Index];
  525.     Length := k + 1;
  526.     Index := Index + Length;
  527. end;
  528.  
  529. Procedure FillFirstSortingArray(var FirstSortingArray: array of Integer; var sort: array of Integer; var SizesOfFirstSortingArray: array of Integer; NumberOfElements: Integer; Length: Integer; var IndexOfIntermediateArray: Integer);
  530.  
  531. var
  532.     i, NumberOfPosition: Integer;
  533.  
  534. begin
  535.     for i := IndexOfIntermediateArray to IndexOfIntermediateArray + Length - 1 do
  536.         FirstSortingArray[i] := sort[i - IndexOfIntermediateArray];
  537.     NumberOfPosition := findPositionToWriteSizesOfFirstSortingArray(SizesOfFirstSortingArray, NumberOfElements);
  538.     SizesOfFirstSortingArray[NumberOfPosition] := Length;
  539.     IndexOfIntermediateArray := IndexOfIntermediateArray + Length;
  540. end;
  541.  
  542. Procedure FillSecondSortingArray(var SecondSortingArray: array of Integer; var sort: array of Integer; var SizesOfSecondSortingArray: array of Integer; NumberOfElements: Integer; Length: Integer; var IndexOfIntermediateArray: Integer);
  543.  
  544. var
  545.     i, NumberOfPosition: Integer;
  546.  
  547. begin
  548.  
  549.     for i := IndexOfIntermediateArray to IndexOfIntermediateArray + Length - 1 do
  550.         SecondSortingArray[i] := sort[i - IndexOfIntermediateArray];
  551.     NumberOfPosition := findPositionToWriteSizesOfSecondSortingArray(SizesOfSecondSortingArray, NumberOfElements);
  552.     SizesOfSecondSortingArray[NumberOfPosition] := Length;
  553.     IndexOfIntermediateArray := IndexOfIntermediateArray + Length;
  554. end;
  555.  
  556. Procedure FillingSortingArrays(var IntermediateArray: array of Integer; var FirstSortingArray: array of Integer; var SecondSortingArray: array of Integer; var SizesOfFirstSortingArray: array of Integer; var SizesOfFSecondSortingArray: array of Integer; NumberOfElements: Integer);
  557.  
  558. var
  559.     Index, IndexOfIntermediateArray, Length, Condition, i: Integer;
  560.     Sort: array of Integer;
  561.  
  562. begin
  563.     Index := 0;
  564.     IndexOfIntermediateArray := 0;
  565.     Length := 0;
  566.     Condition := 0;
  567.     i:= 0;
  568.     SetLength(Sort, NumberOfElements);
  569.     FillingArrayWithZeros(SizesOfFirstSortingArray);
  570.     FillingArrayWithZeros(SizesOfFSecondSortingArray);
  571.     while (i < NumberOfElements) do
  572.     begin
  573.         findSortedPart(IntermediateArray, sort, NumberOfElements, Index, Length);
  574.         if (Condition mod 2 = 0) then
  575.             FillFirstSortingArray(FirstSortingArray, sort, SizesOfFirstSortingArray, NumberOfElements, Length, IndexOfIntermediateArray)
  576.         else
  577.             FillSecondSortingArray(SecondSortingArray, sort, SizesOfFSecondSortingArray, NumberOfElements, Length, IndexOfIntermediateArray);
  578.         Inc(Condition);
  579.         i := i + Length;
  580.     end;
  581. end;
  582.  
  583. Procedure PrintArray(var SourceArray: array of Integer; UserWay: Integer; PathToFile: string);
  584.  
  585. const
  586.     CONSOLE_WAY = 1;
  587.     FILE_WAY = 2;
  588.  
  589. var
  590.     i, EndNumber: Integer;
  591.     FileOut: TextFile;
  592.  
  593. begin
  594.     EndNumber:= Length(SourceArray) - 1;
  595.     case UserWay of
  596.         CONSOLE_WAY:
  597.             begin
  598.                 for i := 0 to  EndNumber do
  599.                     Write(SourceArray[i]:3, ' ');
  600.                 Writeln('');
  601.             end;
  602.         FILE_WAY:
  603.             begin
  604.                 Assign(FileOut, PathToFile);
  605.                 Append(FileOut);
  606.                 for i := 0 to  EndNumber do
  607.                     Write(FileOut ,SourceArray[i]:3, ' ');
  608.                 Writeln(FileOut, '');
  609.                 Close(FileOut);
  610.             end;
  611.     end;
  612. end;
  613.  
  614. Procedure ReceiveNewSourceArray(var IntermediateArray: array of Integer; var FirstSortingArray: array of Integer; SecondSortingArray: array of Integer; SizesOfFirstSortingArray: array of Integer; SizesOfFSecondSortingArray: array of Integer; NumberOfElements: Integer; var UserWay: Integer; var PathToFile: string);
  615.  
  616. var
  617.     Counter, Index, i, j1, j2, z, EndNumber, SizeOfFirstSortingArray, SizeOfSecondSortingArray: Integer;
  618.  
  619. begin
  620.     fillingSortingArrays(IntermediateArray, FirstSortingArray, SecondSortingArray, SizesOfFirstSortingArray, SizesOfFSecondSortingArray, NumberOfElements);
  621.     Counter := FindNumberOfPairs(SizesOfFirstSortingArray, NumberOfElements);
  622.     Index := 0;
  623.     EndNumber := Counter - 1;
  624.     for i := 0 to EndNumber do
  625.     begin
  626.         SizeOfFirstSortingArray := SizesOfFirstSortingArray[i];
  627.         SizeOfSecondSortingArray := SizesOfFSecondSortingArray[i];
  628.         j1 := Index;
  629.         j2 := Index + SizeOfFirstSortingArray;
  630.         z := Index;
  631.         while (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray) do
  632.         begin
  633.             if ((j1 = Index + SizeOfFirstSortingArray) and (j2 <> Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)) then
  634.             begin
  635.                 while (j2 < SizeOfFirstSortingArray + SizeOfSecondSortingArray + Index) do
  636.                 begin
  637.                     IntermediateArray[z] := SecondSortingArray[j2];
  638.                     Inc(z);
  639.                     Inc(j2);
  640.                 end;
  641.             end;
  642.             if ((j2 = Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray) and (j1 <> Index + SizeOfFirstSortingArray)) then
  643.             begin
  644.                 while (j1 < SizeOfFirstSortingArray + Index) do
  645.                 begin
  646.                     IntermediateArray[z] := FirstSortingArray[j1];
  647.                     Inc(z);
  648.                     Inc(j1)
  649.                 end
  650.             end;
  651.             if ((FirstSortingArray[j1] < SecondSortingArray[j2]) and (j2 < NumberOfElements) and (j1 < NumberOfElements) and (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)) then
  652.             begin
  653.                 IntermediateArray[z] := FirstSortingArray[j1];
  654.                 Inc(z);
  655.                 Inc(j1);
  656.             end
  657.             else
  658.             begin
  659.                 if ((SecondSortingArray[j2] < FirstSortingArray[j1]) and (j2 < NumberOfElements) and (j1 < NumberOfElements) and (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)) then
  660.                 begin
  661.                     IntermediateArray[z] := SecondSortingArray[j2];
  662.                     Inc(z);
  663.                     Inc(j2)
  664.                 end
  665.                 else
  666.                     if ((SecondSortingArray[j2] = FirstSortingArray[j1]) and (j2 < NumberOfElements) and (j1 < NumberOfElements) and (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)) then
  667.                     begin
  668.                         IntermediateArray[z] := FirstSortingArray[j1];
  669.                         Inc(z);
  670.                         Inc(j1);
  671.                         IntermediateArray[z] := SecondSortingArray[j2];
  672.                         Inc(z);
  673.                         Inc(j2);
  674.                     end;
  675.             end;
  676.         end;
  677.         Index := Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray;
  678.     end;
  679.     PrintArray(IntermediateArray, UserWay, PathToFile);
  680. end;
  681.  
  682. Procedure ReceieveWayOfOutput(var UserWay: Integer; var PathToFile: string);
  683.  
  684. const
  685.     CONSOLE_WAY = 1;
  686.     FILE_WAY = 2;
  687.  
  688. var
  689.     FileOut: TextFile;
  690.  
  691. begin
  692.     Writeln('Choose way of output:'#13#10'Type ''1'' if you want to print sorting and result in console.'#13#10'Type ''2'' if you want to print sorting and result in file.');
  693.     UserWay := ChooseWayOfOutput();
  694.     case UserWay of
  695.         CONSOLE_WAY:
  696.             begin
  697.                 Writeln('Sorting:');
  698.             end;
  699.         FILE_WAY:
  700.             begin
  701.                 repeat
  702.                     PathToFile := inputPathToFile();
  703.                 until (checkExtension(PathToFile) and checkPermissionForWriting(PathToFile));
  704.                 Assign(FileOut, PathToFile);
  705.                 Rewrite(FileOut);
  706.                 Writeln(FileOut, 'Sorting:');
  707.                 Close(FileOut);
  708.             end;
  709.     end;
  710. end;
  711.  
  712. Procedure Sorting(var SourceArray: array of Integer; var SortedArray: array of Integer; NumberOfElements: Integer; var UserWay: Integer; var PathToFile: string);
  713.  
  714. var
  715.    IntermediateArray, FirstSortingArray, SecondSortingArray, SizesOfFirstSortingArray, SizesOfFSecondSortingArray: array of Integer;
  716.    HalfNumberOfElements: Integer;
  717.  
  718. begin;
  719.     Setlength(IntermediateArray, NumberOfElements);
  720.     Setlength(FirstSortingArray, NumberOfElements);
  721.     Setlength(SecondSortingArray, NumberOfElements);
  722.     HalfNumberOfElements := NumberOfELements div 2 + 1;
  723.     Setlength(SizesOfFirstSortingArray, HalfNumberOfElements);
  724.     Setlength(SizesOfFSecondSortingArray, HalfNumberOfElements);
  725.     CreatingFirstF(IntermediateArray, SourceArray);
  726.     while (not findConditionOfSorted(IntermediateArray)) do
  727.     begin
  728.         ReceiveNewSourceArray(IntermediateArray, FirstSortingArray, SecondSortingArray, SizesOfFirstSortingArray, SizesOfFSecondSortingArray, NumberOfElements, UserWay, PathToFile);
  729.     end;
  730.     CreatingSortedArray(SortedArray, IntermediateArray);
  731. end;
  732.  
  733. Procedure main();
  734.  
  735. var
  736.     NumberOfElements, i, UserWay: Integer;
  737.     SourceArray, SortedArray: array of Integer;
  738.     PathToFile: string;
  739.  
  740. begin
  741.     Writeln('This program implements natural merge sorting.');
  742.     NumberOfElements := ReceiveNumberOfElements(UserWay, PathToFile);
  743.     Setlength(SourceArray, NumberOfElements);
  744.     ReceiveSourceArray(SourceArray, NumberOfElements, UserWay, PathToFile);
  745.     Setlength(SortedArray, NumberOfElements);
  746.     ReceieveWayOfOutput(UserWay, PathToFile);
  747.     Sorting(SourceArray, SortedArray, NumberOfElements, UserWay, PathToFile);
  748.     PrintResult(SortedArray, UserWay, PathToFile);
  749.     Readln;
  750. end;
  751.  
  752. begin
  753.     Main();
  754. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement