Advertisement
stepan12123123123

Untitled

Dec 27th, 2022
577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.74 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes,Variants, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,ShellAPI, Windows, Buttons, ExtCtrls, StdCtrls;
  9.  
  10. type
  11.  
  12.   {LIST}
  13.   TPElem = ^TElem;
  14.   TElem = record
  15.     Data : integer;
  16.     PointNext : TPElem;
  17.   end;
  18.   {Список.}
  19.   TDList = record
  20.   PointBeg, PointEnd : TPElem;
  21.    end;
  22.    { TForm1 }
  23.   TForm1 = class(TForm)
  24.     Button1: TButton;
  25.     Button2: TButton;
  26.     Button3: TButton;
  27.     Button4: TButton;
  28.     Button5: TButton;
  29.     Button6: TButton;
  30.     Edit1: TEdit;
  31.     ListBox1: TListBox;
  32.     ListBox2: TListBox;
  33.     ListBox3: TListBox;
  34.     Memo1: TMemo;
  35.     OpenDialog1: TOpenDialog;
  36.     SaveDialog1: TSaveDialog;
  37.     procedure Button1Click(Sender: TObject);
  38.     procedure Button2Click(Sender: TObject);
  39.     procedure Button3Click(Sender: TObject);
  40.     procedure Button4Click(Sender: TObject);
  41.     procedure Button5Click(Sender: TObject);
  42.     procedure Button6Click(Sender: TObject);
  43.     procedure Edit1Change(Sender: TObject);
  44.     procedure Memo1Change(Sender: TObject);
  45.   private
  46.  
  47.   public
  48.   end;
  49.  
  50. var
  51.   Form1: TForm1;
  52.  
  53. implementation
  54. var
  55. n : integer;
  56. List1, List2 : TDList;
  57. ListForm : TForm1;
  58. {$R *.lfm}
  59.  
  60. { TForm1 }
  61. {Create list}
  62.  
  63. procedure Create_Zero_List(var a: TDList; n : integer);
  64. var
  65. i : integer;
  66. Elem : TPElem;
  67. begin
  68.   a.PointEnd := nil;
  69.   a.PointBeg := nil;
  70.   for i := 0 to n-1 do begin
  71.     New(Elem);
  72.     Elem^.Data := 0;
  73.     Elem^.PointNext := nil;
  74.     if a.PointBeg = nil then begin
  75.        a.PointBeg := Elem;
  76.     end
  77.     else begin
  78.        a.PointEnd^.PointNext := Elem;
  79.     end;
  80.     a.PointEnd := Elem;
  81.   end;
  82. end;
  83. function Slianie(var list1, list2, a: TPElem; n1, n2: integer): TPElem;
  84. var s1 : TDList;
  85. s : TPElem;
  86. n3: integer;
  87. begin
  88.   n3 := n1 + n2;
  89.   Create_Zero_List(s1,n3);
  90.   s := s1.PointBeg;
  91.   while (list1 <> nil) and (list2 <> nil) do begin
  92.     if list1^.Data <= list2^.Data then begin
  93.        s^.Data := list1^.Data;
  94.        s := s^.PointNext;
  95.        list1 := list1^.PointNext;
  96.     end
  97.     else begin
  98.        s^.Data := list2^.Data;
  99.        s := s^.PointNext;
  100.        list2 := list2^.PointNext;
  101.       end;
  102.   end;
  103.   if list1 = nil then begin
  104.       while list2 <> nil do begin
  105.         s^.Data := list2^.Data;
  106.         s := s^.PointNext;
  107.         list2 := list2^.PointNext;
  108.       end;
  109.   end
  110.   else begin
  111.      while list1 <> nil do begin
  112.        s^.Data := list1^.Data;
  113.        s := s^.PointNext;
  114.        list1 := list1^.PointNext;
  115.      end;
  116.   end;
  117.   Slianie := s1.PointBeg;
  118. end;
  119. procedure MergeSort(var a: TPElem; n : integer);
  120. var p1, p2: TPElem;
  121. k, i : integer;
  122. begin
  123.   if n > 1 then begin
  124.      k := n div 2;
  125.      p1 := a;
  126.      for i := 1 to k-1 do begin
  127.        p1 := p1^.PointNext;
  128.      end;
  129.      p2 := p1^.PointNext;
  130.      p1^.PointNext := nil;
  131.      p1 := a;
  132.      MergeSort(p1, k);
  133.      MergeSort(p2, n-k);
  134.      a := Slianie(p1, p2, a, k, n-k);
  135.   end;
  136. end;
  137.  
  138.  
  139. procedure Create_List(var a: TDList; n : integer);
  140. var
  141. i : integer;
  142. Elem : TPElem;
  143. begin
  144.   randomize;                          
  145.   a.PointEnd := nil;
  146.   a.PointBeg := nil;
  147.   for i := 0 to n-1 do begin
  148.     New(Elem);
  149.     Elem^.Data := random(1999)-999;
  150.     Elem^.PointNext := nil;
  151.     if a.PointBeg = nil then begin
  152.        a.PointBeg := Elem;
  153.     end
  154.     else begin
  155.        a.PointEnd^.PointNext := Elem;
  156.     end;
  157.     a.PointEnd := Elem;
  158.   end;
  159. end;
  160. procedure Create_List_Order(var a: TDList; n : integer);
  161. var
  162. i,k : integer;
  163. Elem : TPElem;
  164. begin
  165.   randomize;
  166.   k := -1000;
  167.   a.PointEnd := nil;
  168.   a.PointBeg := nil;
  169.   for i := 0 to n-1 do begin
  170.     New(Elem);
  171.     Elem^.Data := random(1999)-999;
  172.     while Elem^.Data < k do begin
  173.         Elem^.Data := random(1999)-999;
  174.     end;
  175.     k := Elem^.Data;
  176.     Elem^.PointNext := nil;
  177.     if a.PointBeg = nil then begin
  178.        a.PointBeg := Elem;
  179.     end
  180.     else begin
  181.        a.PointEnd^.PointNext := Elem;
  182.     end;
  183.     a.PointEnd := Elem;
  184.   end;
  185. end;
  186.  
  187. procedure Writer1(var a : TDList; n : integer);
  188. var Elem : TPElem;
  189. begin
  190.   Form1.ListBox1.Clear;
  191.   if n <= 40 then begin
  192.   Elem := a.PointBeg;
  193.   if Elem = nil then begin
  194.      Form1.ListBox1.Items.Add('--');
  195.      end
  196.   else begin
  197.     While Elem <> nil do begin
  198.       if Elem <> a.PointEnd then begin
  199.          Form1.ListBox1.Items.Add(IntToStr(Elem^.Data));
  200.          Elem := Elem^.PointNext;
  201.       end
  202.       else begin
  203.         Form1.ListBox1.Items.Add(IntToStr(Elem^.Data));
  204.         break;
  205.       end;
  206.     end;
  207.   end;
  208.   end
  209.   else
  210.      Form1.ListBox1.Items.Add('SOCHI KLASS!!!');
  211. end;
  212. procedure Writer2(var a : TDList; n : integer);
  213. var Elem : TPElem;
  214. begin
  215.   Form1.ListBox2.Clear;
  216.   if n <= 40 then begin
  217.   Elem := a.PointBeg;
  218.   if Elem = nil then begin
  219.      Form1.ListBox2.Items.Add('--');
  220.      end
  221.   else begin
  222.     While Elem <> nil do begin
  223.       if Elem <> a.PointEnd then begin
  224.          Form1.ListBox2.Items.Add(IntToStr(Elem^.Data));
  225.          Elem := Elem^.PointNext;
  226.       end
  227.       else begin
  228.         Form1.ListBox2.Items.Add(IntToStr(Elem^.Data));
  229.         break;
  230.       end;
  231.     end;
  232.   end;
  233.   end
  234.   else
  235.      Form1.ListBox2.Items.Add('SOCHI KLASS!!!');
  236. end;
  237. procedure Writer3(var a : TDList; n : integer);
  238. var Elem : TPElem;
  239. begin
  240.   Form1.ListBox3.Clear;
  241.   Elem := a.PointBeg;
  242.   if Elem = nil then begin
  243.      Form1.ListBox3.Items.Add('--');
  244.      end
  245.   else begin
  246.     While Elem <> nil do begin
  247.       if Elem <> a.PointEnd then begin
  248.          Form1.ListBox3.Items.Add(IntToStr(Elem^.Data));
  249.          Elem := Elem^.PointNext;
  250.       end
  251.       else begin
  252.         Form1.ListBox3.Items.Add(IntToStr(Elem^.Data));
  253.         break;
  254.       end;
  255.     end;
  256.   end;
  257. end;
  258. procedure TForm1.Button1Click(Sender: TObject);
  259. begin
  260.    n := StrToInt(Edit1.Text);
  261.    Create_List(List1, n);
  262.    if n <= 40 then begin
  263.    Writer1(List1, n)
  264.    end;
  265. end;
  266.  
  267. procedure TForm1.Button2Click(Sender: TObject);
  268. begin
  269.     n := StrToInt(Edit1.Text);
  270.    Create_List_Order(List2, n);
  271.    if n <= 40 then begin
  272.    Writer2(List2, n)
  273.    end;
  274. end;
  275.  
  276. procedure TForm1.Button3Click(Sender: TObject);
  277. begin
  278.   n := StrToInt(Edit1.Text);
  279.   MergeSort(List1.PointBeg, n);
  280.   if n <= 40 then begin
  281.   Writer3(List1, n);
  282.   end;
  283. end;
  284.  
  285. procedure TForm1.Button4Click(Sender: TObject);
  286. begin
  287.   Close;
  288. end;
  289. procedure TForm1.Button6Click(Sender: TObject);
  290. var err_code: integer;
  291. begin
  292.   Memo1.Lines.Clear;
  293.   Memo1.Lines.Add('Укажите файл');
  294.   if OpenDialog1.Execute then begin
  295.      if FileExists(OpenDialog1.FileName) then begin
  296.         Memo1.Lines.Add('Открыт Файл ' + OpenDialog1.FileName);
  297.         if OpenDialog1.Execute then begin
  298.         err_code := ShellExecute(Handle, 'open', PChar(OpenDialog1.FileName), nil, nil, SW_SHOW)
  299.         end;
  300.      end
  301.      else Memo1.Lines.Add('Файл ' + OpenDialog1.FileName + ' не найден');
  302.   end
  303.   else;
  304. end;
  305. procedure TForm1.Button5Click(Sender : TObject);
  306. var
  307. outf : textfile;
  308. Elem : TPElem;
  309. begin
  310.    Memo1.Lines.Clear;
  311.    Memo1.Lines.Add('Укажите файл для сохранения');
  312.    if OpenDialog1.Execute then begin
  313.    assignfile(outf,OpenDialog1.FileName);
  314.    rewrite(outf);
  315.    Elem := List1.PointBeg;
  316.    if Elem = nil then begin
  317.      write(outf, '--');
  318.      end
  319.   else begin
  320.     While Elem <> nil do begin
  321.       if Elem <> List1.PointEnd then begin
  322.          write(outf, Elem^.Data, ' ');
  323.          Elem := Elem^.PointNext;
  324.       end
  325.       else begin
  326.         write(outf, Elem^.Data, ' ');
  327.         break;
  328.       end;
  329.     end;
  330.   end;
  331.   closefile(outf);
  332.   Memo1.Lines.Clear;
  333.   Memo1.Lines.Add('Список записан в файл' + OpenDialog1.FileName);
  334.    end;
  335. end;
  336. procedure TForm1.Edit1Change(Sender: TObject);
  337. begin
  338.  
  339. end;
  340.  
  341. procedure TForm1.Memo1Change(Sender: TObject);
  342. begin
  343.  
  344. end;
  345.  
  346. end.
  347.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement