Advertisement
MrHumansuit

Информатика 1 Семестр - работа на Автомат

Oct 24th, 2023
1,542
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.98 KB | None | 0 0
  1. {
  2. Сортировка методом Шелла с использованием последовательности Гнута и подмассивов (Подмассивы сортируются методом вставок)
  3. В Memo выводится показательное отображение сортировки
  4. В StringGrid выводится этапы сортировки
  5. }
  6. unit HW_8_Avtomat;
  7.  
  8. interface
  9.  
  10. uses
  11.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  12.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Math;
  13.  
  14. type
  15.   TForm1 = class(TForm)
  16.     StringGrid_Sort: TStringGrid;
  17.     Edit_GenString: TEdit;
  18.     Edit_SortString: TEdit;
  19.     Button_Gen: TButton;
  20.     Button_Sort: TButton;
  21.     Memo: TMemo;
  22.     procedure Button_GenClick(Sender: TObject);
  23.     procedure Button_SortClick(Sender: TObject);
  24.  
  25.   private
  26.     function ShellSort_StringGrid(const NumbersArray: array of Real): TStringList;
  27.     function ShellSort_Memo(const NumbersArray: array of Real): TMemo;
  28.  
  29.     { Private declarations }
  30.   public
  31.     { Public declarations }
  32.   end;
  33.  
  34. var
  35.   Form1: TForm1;
  36.  
  37. implementation
  38.  
  39. {$R *.dfm}
  40.  
  41. procedure TForm1.Button_GenClick(Sender: TObject);
  42. var
  43.  Numbers: TStringList;
  44.  i: Integer;
  45.  Sequence: string;
  46.  
  47. begin
  48.   Numbers := TStringList.Create;
  49.   for i := 0 to 24 do
  50.     Numbers.Add(IntToStr(i));
  51.  
  52.   for i := 0 to Numbers.Count - 1 do
  53.     Numbers.Exchange(i, Random(Numbers.Count));
  54.  
  55.   Sequence := '';
  56.  
  57.   for i := 0 to Numbers.Count - 1 do
  58.     begin
  59.       if i <> 0 then
  60.         Sequence := Sequence + ', ';
  61.         Sequence := Sequence + Numbers[i];
  62.     end;
  63.  
  64.   Edit_GenString.Text := Sequence;
  65.   Numbers.Free;
  66. end;
  67.  
  68. function ArrayToStr(const Arr: array of Real): string;
  69. var
  70.  i: Integer;
  71.  
  72. begin
  73.  Result := '';
  74.  
  75.  for i := 0 to High(Arr) do
  76.   begin
  77.     if i > 0 then
  78.       Result := Result + ', ';
  79.       Result := Result + FloatToStr(Arr[i]);
  80.   end;
  81. end;
  82.  
  83. function TForm1.ShellSort_StringGrid(const NumbersArray: array of Real): TStringList;
  84. var
  85.  Gap, i, j : Integer;
  86.  Temp: Real;
  87.  TempArray: array of Real;
  88.  
  89. begin
  90.  Result := TStringList.Create;
  91.  SetLength(TempArray, Length(NumbersArray));
  92.  Move(NumbersArray[0], TempArray[0], Length(NumbersArray) * SizeOf(Real));
  93.  Gap := 1;
  94.  
  95. while Gap < Length(TempArray) div 3 do
  96.   Gap := Gap * 3 + 1;
  97.   while Gap > 0 do
  98.     begin
  99.     for i := Gap to Length(NumbersArray) - 1 do
  100.       begin
  101.        Temp := TempArray[i];
  102.        j := i;
  103.        while (j >= Gap) and (TempArray[j - Gap] > Temp) do
  104.         begin
  105.           TempArray[j] := TempArray[j - Gap];
  106.           j := j - Gap;
  107.         end;
  108.        TempArray[j] := Temp;
  109.        Result.Add(ArrayToStr(TempArray));
  110.       end;
  111.       Gap := Gap div 3;
  112.     end;
  113. end;
  114.  
  115. function TForm1.ShellSort_Memo(const NumbersArray: array of Real): TMemo;
  116. var
  117.  Gap, step_count, n, k, b, h, e, f, g, a, i, j: Integer;
  118.  key : Real;
  119.  display_arr: TStringList;
  120.  TempArrayM, TempArraySwap, TempArrayEnd: array of Real;
  121.  displayString: string;
  122. begin
  123.   n := Length(NumbersArray);
  124.   Step_count := 0;
  125.   SetLength(TempArrayM, Length(NumbersArray));
  126.   Move(NumbersArray[0], TempArrayM[0], Length(NumbersArray) * SizeOf(Real));
  127.   Gap := 1;
  128.  
  129.   while Gap < n div 3 do
  130.     Gap := Gap * 3 + 1;
  131.  
  132.   while Gap > 0 do
  133.     begin
  134.       Inc(step_count);
  135.       Memo.Lines.Add(#13#10 + 'Интервал: ' + IntToStr(Gap));
  136.       Memo.Lines.Add(#13#10 + '===> Входящий массив:');
  137.       display_arr := TStringList.Create;
  138.       h := 1;
  139.  
  140.       for k := 0 to Length(TempArrayM) - 1 do
  141.         begin
  142.           display_arr.Add(FloatToStr(TempArrayM[k]));
  143.           h := h + 1;
  144.         end;
  145.  
  146.       displayString := '';
  147.  
  148.       for b := 0 to display_arr.Count - 1 do
  149.         displayString := displayString + display_arr[b] + ', ';
  150.  
  151.       Memo.Lines.Add(TrimRight(displayString));
  152.       display_arr.Free;
  153.       a := (n div Gap);
  154.       SetLength(TempArraySwap, a + 1 );
  155.       e := 0;
  156.       f := 0;
  157.       Memo.Lines.Add('');
  158.       Memo.Lines.Add('Исходный массив: ' + IntToStr(n) + ' || Количество элементов подмассивa: ' + IntToStr(a + 1) + ' || Интервал: ' + IntToStr(gap));
  159.       Memo.Lines.Add('');
  160.       while (f <= Length(TempArrayM) - 1) do
  161.         begin
  162.           Memo.Lines.Add('====> В подмассив добавлено: ' + FloatToStr(TempArrayM[f]) + ' | f = ' + IntToStr(f));
  163.           TempArraySwap[e] := TempArrayM[f];
  164.           f := f + gap;
  165.           Memo.Lines.Add('=====> Новая f = ' + IntToStr(f));
  166.           Inc(e);
  167.         end;
  168.  
  169.       Memo.Lines.Add(#13#10 + '===> Подмассив с нулями:');
  170.       display_arr := TStringList.Create;
  171.       f := 0;
  172.  
  173.       for k := 0 to n - 1 do
  174.       begin
  175.         if (k = f) and (k <> n) then
  176.           begin
  177.             display_arr.Add(FloatToStr(TempArrayM[k]));
  178.             f := f + gap;
  179.           end
  180.         else
  181.           display_arr.Add('[ ]');
  182.       end;
  183.  
  184.       displayString := '';
  185.  
  186.       for b := 0 to display_arr.Count - 1 do
  187.         begin
  188.           if displayString <> '' then
  189.             displayString := displayString + ', ';
  190.           displayString := displayString + display_arr[b];
  191.         end;
  192.  
  193.       Memo.Lines.Add(TrimRight(displayString));
  194.       display_arr.Free;
  195.  
  196.       for i := 1 to Length(TempArraySwap) - 1 do
  197.         begin
  198.           key := TempArraySwap[i];
  199.           j := i - 1;
  200.           while (j >= 0) and (key < TempArraySwap[j]) do
  201.             begin
  202.               TempArraySwap[j + 1] := TempArraySwap[j];
  203.               j := j - 1;
  204.             end;
  205.           TempArraySwap[j + 1] := key;
  206.         end;
  207.  
  208.       display_arr := TStringList.Create;
  209.  
  210.       for k := 0 to Length(TempArraySwap) - 1 do
  211.         display_arr.Add(FloatToStr(TempArraySwap[k]));
  212.  
  213.       Memo.Lines.Add(#13#10 + '===> Отсортированный подмассив:');
  214.       displayString := '';
  215.  
  216.       for b := 0 to display_arr.Count - 1 do
  217.         begin
  218.           if displayString <> '' then
  219.             displayString := displayString + ', ';
  220.           displayString := displayString + display_arr[b];
  221.         end;
  222.  
  223.       Memo.Lines.Add(TrimRight(displayString));
  224.       Memo.Lines.Add(#13#10 + 'Количество шагов: ' + IntToStr(step_count));
  225.       display_arr.Free;
  226.       f := 0;
  227.  
  228.     for i := 0 to Length(TempArraySwap) - 1 do
  229.       begin
  230.         TempArrayM[f mod Length(TempArrayM)] := TempArraySwap[i];
  231.         f := f + gap;
  232.       end;
  233.  
  234.       display_arr := TStringList.Create;
  235.       h := 1;
  236.       f := 0;
  237.  
  238.       for k := 0 to Length(TempArrayM) - 1 do
  239.         begin
  240.           if (k = f) and (k <> n) then
  241.             begin
  242.               display_arr.Add('[' + FloatToStr(TempArrayM[k]) + ']');
  243.               f := f + gap;
  244.             end
  245.           else
  246.             display_arr.Add(FloatToStr(TempArrayM[k]));
  247.           h := h + 1;
  248.         end;
  249.  
  250.       Memo.Lines.Add(#13#10 + 'Итоговый массив итерации:');
  251.       displayString := '';
  252.       f := 0;
  253.  
  254.       for b := 0 to display_arr.Count - 1 do
  255.         begin
  256.           if displayString <> '' then
  257.             displayString := displayString + ', ';
  258.           displayString := displayString + display_arr[b];
  259.         end;
  260.  
  261.       Memo.Lines.Add(TrimRight(displayString));
  262.       display_arr.Free;
  263.       SetLength(TempArraySwap, 0);
  264.       gap := gap div 3;
  265.     end;
  266.   SetLength(TempArraySwap, 0);
  267. end;
  268.  
  269. procedure TForm1.Button_SortClick(Sender: TObject);
  270. var
  271.   Numbers, Numbers_StringGrid, SortedNumbers: TStringList;
  272.   i, Row: Integer;
  273.   NumbersArray, NumbersArray_StringGrid: array of Real;
  274.   LastCell: TGridCoord;
  275.   InputString, SpecString, InputString_StringGrid: string;
  276.   NumberArr: TArray<string>;
  277. begin
  278.  
  279.   Numbers := TStringList.Create;
  280.   InputString := Edit_GenString.Text;
  281.   Numbers.Delimiter := ',';
  282.   Numbers.DelimitedText := InputString;
  283.   SetLength(NumbersArray, Numbers.Count);
  284.  
  285.   for i := 0 to Numbers.Count - 1 do
  286.     NumbersArray[i] := StrToFloat(Numbers[i]);
  287.  
  288.   Memo.Clear();
  289.   ShellSort_Memo(NumbersArray);
  290.  
  291.   SortedNumbers := ShellSort_StringGrid(NumbersArray);
  292.   StringGrid_Sort.RowCount := SortedNumbers.Count;
  293.  
  294.   for i := 0 to SortedNumbers.Count - 1 do
  295.     StringGrid_Sort.Cells[0, i] := SortedNumbers[i];
  296.  
  297.   for i := SortedNumbers.Count to StringGrid_Sort.RowCount - 1 do
  298.     StringGrid_Sort.Cells[0, i] := '';
  299.  
  300.   Row := -1;
  301.  
  302.   for Row := StringGrid_Sort.RowCount - 1 downto 0 do
  303.     begin
  304.       if StringGrid_Sort.Cells[0, Row] <> '' then
  305.         Break;
  306.     end;
  307.  
  308.   if Row >= 0 then
  309.     Edit_SortString.Text := StringGrid_Sort.Cells[0, Row];
  310.  
  311.   SpecString := Edit_SortString.Text;
  312.   NumberArr := SpecString.Split([',']);
  313.   SpecString := '';
  314.  
  315.   for i := 0 to Length(NumberArr) - 1 do
  316.     begin
  317.       SpecString := SpecString + '[' + Trim(NumberArr[i]) + ']';
  318.       if i < Length(NumberArr) - 1 then
  319.         SpecString := SpecString + ', ';
  320.     end;
  321.  
  322.   Memo.Lines[Memo.Lines.Count - 1] := SpecString;
  323.   end;
  324. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement