Advertisement
VadimThink

Untitled

Dec 9th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.59 KB | None | 0 0
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   System.SysUtils;
  9.  
  10. const
  11.     NMAX = 100;
  12.  
  13. type
  14.     TIntArray = array of Integer;
  15.  
  16. function GetArraySize(): Integer;
  17.  
  18. const
  19.     MAXSIZE = 101;
  20.    MINSIZE = 1;
  21.  
  22. var
  23.     IsCorrect: Boolean;
  24.    SizeOfArray: Integer;
  25.  
  26. begin
  27.     IsCorrect := False;
  28.    repeat
  29.       try
  30.          Writeln('Введите количество элементов массива, число должно быть больше ', MinSize, ' но меньше ', MaxSize);
  31.          Readln(SizeOfArray);
  32.          isCorrect := True;
  33.       except
  34.         Writeln('Число должно быть целым!');
  35.       end;
  36.    until (IsCorrect and (SizeOfArray > MINSIZE) and (SizeOfArray < MAXSIZE));
  37.    GetArraySize:= SizeOfArray;
  38. end;
  39.  
  40. function GetArrayFromKeyboard(SizeOfArray: Integer): TIntArray;
  41.  
  42. const
  43.     MINNUMB = - 51;
  44.    MAXNUMB = 51;
  45. var
  46.    i, Temp: Integer;
  47.    IsCorrect: Boolean;
  48.    ArrayOfInt: TIntArray;
  49.  
  50. begin
  51.     IsCorrect:= False;
  52.    SetLength(ArrayOfInt, SizeOfArray);
  53.    Temp:= SizeOfArray - 1;
  54.     for i := 0 to Temp do
  55.    begin
  56.     repeat
  57.         try
  58.             Writeln('Введите ', i, ' элемент массива. Он должен быть больше ', MINNUMB, ' но меньше, чем ', MAXNUMB);
  59.             Readln(ArrayOfInt[i]);
  60.             IsCorrect := True;
  61.          except
  62.             Writeln('Число должно быть целым!');
  63.          end;
  64.       until (IsCorrect and (ArrayOfInt[i] > MINNUMB) and (ArrayOfInt[i] < MAXNUMB));
  65.    end;
  66.    Writeln('Исходный массив:');
  67.     Temp:= SizeOfArray - 1;
  68.    for i:= 0 to Temp do
  69.     Write(ArrayOfInt[i]:4);
  70.    GetArrayFromKeyboard:= ArrayOfInt;
  71. end;
  72.  
  73. function GetArrayFromFile(SizeOfArray: Integer): TIntArray;
  74.  
  75. var
  76.    Input: TextFile;
  77.    i, Temp: Integer;
  78.    Path: String;
  79.    ArrayOfInt: TIntArray;
  80.  
  81. begin
  82.     SetLength(ArrayOfInt, SizeOfArray);
  83.    Writeln('Введите, пожалуйста, путь к файлу, например C:\Users\Think\Desktop\Input.txt');
  84.    Readln(Path);
  85.    AssignFile(Input, Path);
  86.    Reset(Input);
  87.    Writeln('-------------------------------------------------------');
  88.    Writeln('Были введены числа:');
  89.    Temp:= SizeOfArray - 1;
  90.    for i:= 0 to Temp do
  91.    begin
  92.     Read(Input, ArrayOfInt[i]);
  93.       Write(ArrayOfInt[i]:4);
  94.    end;
  95.    Writeln;
  96.    Writeln('-------------------------------------------------------');
  97.    Close(Input);
  98.    GetArrayFromFile:= ArrayOfInt;
  99. end;
  100.  
  101. function Input(SizeOfArray: Integer): TIntArray;
  102.  
  103. var
  104.    IsCorrect: Boolean;
  105.    InputKeyboardOrFile: Char;
  106.    ArrayOfInt: TIntArray;
  107.  
  108. begin
  109.    Writeln('Если ввод массива будет осуществляться с клавиатуры, напишите букву K, если из файла - напишите F');
  110.    IsCorrect := False;
  111.    repeat
  112.     Readln(InputKeyboardOrFile);
  113.     case InputKeyboardOrFile of
  114.       'K':
  115.         begin
  116.             ArrayOfInt:= GetArrayFromKeyboard(SizeOfArray);
  117.             IsCorrect:= True;
  118.         end;
  119.       'F':
  120.         begin
  121.            ArrayOfInt:= GetArrayFromFile(SizeOfArray);
  122.             IsCorrect:= True;
  123.         end;
  124.         else
  125.         Writeln('Пожалуйста, введите K или F');
  126.     end;
  127.    until(IsCorrect);
  128.    Input := ArrayOfInt;
  129. end;
  130.  
  131. procedure BinarySorting(var ArrayOfInt: TIntArray; SizeOfArray: Integer);
  132.  
  133. var
  134.    i, j, Temp, TempPlus, TempMinus, LeftSide, RightSide, CurrentElement, Middle: Integer;
  135.  
  136. begin
  137.    Temp:= SizeOfArray - 1;
  138.     for i:= 1 to Temp do
  139.    begin
  140.     CurrentElement:= ArrayOfInt[i];{запомним элемент}
  141.       LeftSide:= 0;{левый край}
  142.       RightSide := i - 1;{правый}
  143.     while LeftSide <= RightSide do {пока левый не больше правого}
  144.         begin
  145.             Middle:= (LeftSide + RightSide) div 2;{находим середину}
  146.          TempPlus:= Middle + 1;
  147.          TempMinus:= Middle - 1;
  148.             if CurrentElement < ArrayOfInt[Middle] then
  149.             RightSide:= TempMinus{если элемент меньше среднего, правый край левее середины}
  150.             else
  151.             LeftSide:= TempPlus{иначе левый правее середины}
  152.       end;
  153.       TempMinus:= i - 1;
  154.     for j:= TempMinus downto LeftSide do
  155.         ArrayOfInt[j + 1]:= ArrayOfInt[j];{сдвигаем массив вправо на 1}
  156.     ArrayOfInt[LeftSide]:= CurrentElement{вставляем элемент на место}
  157.    end; { Окончание алгоритма сортировки}
  158. end;
  159.  
  160. procedure SaveToFile(ArrayOfInt: TIntArray; SizeOfArray: Integer);
  161.  
  162. var
  163.     OutputFile: TextFile;
  164.    i, Temp: Integer;
  165.    Path: String;
  166. begin
  167.     Writeln('Введите, пожалуйста, путь к файлу, например: C:\Users\Think\Desktop\Output.txt');
  168.    Readln(Path);
  169.    AssignFile(OutputFile, Path);
  170.    Rewrite(OutputFile);
  171.    Writeln(OutputFile, '-------------------------------------------------------');
  172.    Writeln(OutputFile, 'Отсортированный массив');
  173.    Temp:= SizeOfArray - 1;
  174.    for i:= 0 to Temp do
  175.     Write(OutputFile, ArrayOfInt[i]:4);
  176.    Writeln;
  177.    Writeln(OutputFile, '-------------------------------------------------------');
  178.    Close(OutputFile);
  179. end;
  180.  
  181. procedure Output(ArrayOfInt: TIntArray; SizeOfArray: Integer);
  182.  
  183. var
  184.    ChooseOutput: Char;
  185.    IsCorrect: Boolean;
  186.    i, Temp: Integer;
  187.  
  188. begin
  189.     Writeln('-------------------------------------------------------');
  190.     Writeln('Отсортированный массив:');
  191.    Temp:= SizeOfArray - 1;
  192.     for i:= 0 to Temp do
  193.     Write(ArrayOfInt[i]:4);
  194.    Writeln;
  195.    Writeln('-------------------------------------------------------');
  196.     Writeln('Вы хотите записать результат в файл? Если да - введите Y, если нет - введите N');
  197.    IsCorrect:= False;
  198.     repeat
  199.        Readln(ChooseOutput);
  200.        case ChooseOutput of
  201.             'Y':
  202.             begin
  203.                SaveToFile(ArrayOfInt, SizeOfArray);
  204.                Writeln('Результат был записан в файл');
  205.                IsCorrect := True;
  206.             end;
  207.             'N':
  208.             begin
  209.                 Writeln('Результат не был записан в файл');
  210.                 IsCorrect := True;
  211.             end;
  212.             else
  213.             Writeln('Пожалуйста, введите Y или N');
  214.        end;
  215.       until(IsCorrect);
  216. end;
  217.  
  218. var
  219.     ArrayOfInt: TIntArray;
  220.    SizeOfArray: Integer;
  221.  
  222. begin
  223.     Writeln('Эта программа выполняет сортировку массива бинарными вставками');
  224.     SizeOfArray:= GetArraySize();
  225.    SetLength(ArrayOfInt, SizeOfArray);
  226.    ArrayOfInt:= Input(SizeOfArray);
  227.     Writeln;
  228.    BinarySorting(ArrayOfInt, SizeOfArray);
  229.     Output(ArrayOfInt, SizeOfArray);
  230.    Readln;
  231. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement