Advertisement
MadCortez

Untitled

Mar 30th, 2021
515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.71 KB | None | 0 0
  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.Grids;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     FileButton: TMenuItem;
  13.     AboutButton: TMenuItem;
  14.     ReadButton: TMenuItem;
  15.     SaveButton: TMenuItem;
  16.     OpenDialog1: TOpenDialog;
  17.     SaveDialog1: TSaveDialog;
  18.     Start: TButton;
  19.     NEdit: TEdit;
  20.     MEdit: TEdit;
  21.     NLabel: TLabel;
  22.     MLabel: TLabel;
  23.     procedure AboutButtonClick(Sender: TObject);
  24.     procedure OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  25.     procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  26.     procedure EditChange(Sender: TObject);
  27.     procedure ReadButtonClick(Sender: TObject);
  28.     procedure SaveButtonClick(Sender: TObject);
  29.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  30.     procedure EditKeyPress(Sender: TObject; var Key: Char);
  31.     procedure StartClick(Sender: TObject);
  32.   private
  33.     { Private declarations }
  34.   public
  35.     { Public declarations }
  36.   end;
  37.  
  38.    PLinkedList = ^TLinkedList;
  39.    TLinkedList = record
  40.     Data : Integer;
  41.     Next : PLinkedList;
  42.    end;
  43. {$R *.dfm}
  44.  
  45. var
  46.   Form1: TForm1;
  47.   N, M, Size: Integer;
  48.   AList, Head: PLinkedList;
  49.   Ans: String;
  50. const
  51.    MIN_SIZE = 1;
  52.    MAX_SIZE = 20;
  53.  
  54. implementation
  55. procedure ShowAns(Ans: String); stdcall; external 'MyDll.dll';
  56.  
  57. procedure TForm1.EditChange(Sender: TObject);
  58. var
  59.    IsValid1, IsValid2: Boolean;
  60.    i: Integer;
  61. begin
  62.    IsValid1 := False;
  63.    IsValid2 := False;
  64.    SaveButton.Enabled := False;
  65.    if NEdit.Text <> '' then
  66.       IsValid1 := True;
  67.    if MEdit.Text <> '' then
  68.       IsValid2 := True;
  69.    if (IsValid1) and (IsValid2) then
  70.       Start.Enabled := True
  71.    else
  72.       Start.Enabled := False;
  73. end;
  74.  
  75. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  76. begin
  77.    CanClose := MessageDlg('Вы уверены, что хотите выйти из программы?' +
  78.       #10#13 + 'Все несохраненные данные будут утеряны.',
  79.       mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  80. end;
  81.  
  82. procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
  83. const
  84.    Digit: set of Char = ['0'..'9', #8];
  85. begin
  86.    with (Sender as TEdit) do
  87.    begin
  88.       if not(Key in Digit) then
  89.          Key := #0;
  90.    end;
  91.    SaveButton.Enabled := False;
  92. end;
  93.  
  94. procedure TForm1.AboutButtonClick(Sender: TObject);
  95. var
  96.    Task: String;
  97. begin
  98.    Task := 'N ребят встали в круг. Каждый раз, начиная с первого, из круга выводится каждый M-й. '
  99.       + 'Вывести номера в порядке выбывания и номер последнего оставшегося.' + #10#13;
  100.    Task := Task + 'Автор - Пестунов Илья, гр. 051007';
  101.    MessageDlg(Task, mtInformation, [mbOK], 0);
  102. end;
  103.  
  104. procedure TForm1.ReadButtonClick(Sender: TObject);
  105. var
  106.    MyFile: TextFile;
  107.    i, Value, j: Integer;
  108. begin
  109.    MEdit.Text := '';
  110.    NEdit.Text := '';
  111.    Start.Enabled := False;
  112.    if OpenDialog1.Execute then
  113.    begin
  114.       AssignFile(MyFile, OpenDialog1.FileName);
  115.       Reset(MyFile);
  116.       Read(MyFile, N, M);
  117.       NEdit.Text := IntToStr(N);
  118.       MEdit.Text := IntToStr(M);
  119.       CloseFile(MyFile);
  120.       Start.Enabled := True;
  121.    end;
  122. end;
  123.  
  124. procedure TForm1.SaveButtonClick(Sender: TObject);
  125. var
  126.    MyFile: TextFile;
  127.    i, j: Integer;
  128. begin
  129.    if SaveDialog1.Execute then
  130.    begin
  131.       AssignFile(MyFile, SaveDialog1.FileName);
  132.       Rewrite(MyFile);
  133.       Writeln(MyFile, Ans);
  134.       CloseFile(MyFile);
  135.       MessageDlg('Результат успешно сохранён', mtCustom, [mbOK], 0);
  136.    end;
  137. end;
  138.  
  139. procedure TForm1.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  140. var
  141.    IsValid: Boolean;
  142.    N, i, Value, Err, j: Integer;
  143.    MyFile: TextFile;
  144.    Check: String;
  145. const
  146.    Digit: set of Char = ['1'..'9', '0', ' ', '-'];
  147. begin
  148.    IsValid := True;
  149.    N := Length(OpenDialog1.FileName);
  150.    if (OpenDialog1.FileName[N] = 't') and (OpenDialog1.FileName[N - 1] = 'x')
  151.    and (OpenDialog1.FileName[N - 2] = 't') then
  152.    begin
  153.       AssignFile(MyFile, OpenDialog1.FileName);
  154.       Reset(MyFile);
  155.       Read(MyFile, Check);
  156.       CloseFile(MyFile);
  157.       if Length(Check) = 0 then
  158.       begin
  159.          MessageDlg('Файл пуст', mtWarning, [mbOK], 0);
  160.          IsValid := False;
  161.       end
  162.       else
  163.       begin
  164.          AssignFile(MyFile, OpenDialog1.FileName);
  165.          Reset(MyFile);
  166.          try
  167.             Readln(MyFile, N, M);
  168.          except
  169.             IsValid := False;
  170.             MessageDlg('Числа N и M должны быть натуральными от 1 до 20', mtWarning, [mbOK], 0);
  171.          end;
  172.          if ((IsValid) and (N < MIN_SIZE)) or ((IsValid) and (N > MAX_SIZE))
  173.          or ((IsValid) and (M < MIN_SIZE)) or ((IsValid) and (M > MAX_SIZE)) then
  174.          begin
  175.             IsValid := False;
  176.             MessageDlg('Числа N и M должны быть натуральными от 1 до 20', mtError, [mbOK], 0);
  177.          end;
  178.          CloseFile(MyFile);
  179.       end;
  180.    end
  181.    else
  182.    begin
  183.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  184.       IsValid := False;
  185.    end;
  186.    if not(IsValid) then
  187.       CanClose := False;
  188. end;
  189.  
  190. procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  191. var
  192.    N: Integer;
  193. begin
  194.    N := Length(SaveDialog1.FileName);
  195.    if (SaveDialog1.FileName[N] = 't') and (SaveDialog1.FileName[N - 1] = 'x')
  196.    and (SaveDialog1.FileName[N - 2] = 't') then
  197.       CanClose := True
  198.    else
  199.    begin
  200.       CanClose := False;
  201.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  202.    end;
  203. end;
  204.  
  205. procedure Add(Info: Integer);
  206. var
  207.    AddList: PLinkedList;
  208. begin
  209.    New(AddList);
  210.    AddList.Data := Info;
  211.    AddList.Next := nil;
  212.    if Head = nil then
  213.    begin
  214.       Head := AddList;
  215.       AList := AddList;
  216.    end
  217.    else
  218.    begin
  219.       AList := Head;
  220.       while not (AList.Next = nil) do
  221.          AList := AList.Next;
  222.       AList.Next := AddList;
  223.    end;
  224.    AList := Head;
  225. end;
  226.  
  227. procedure DeleteList(List: PLinkedList);
  228. var
  229.    Temp: PLinkedList;
  230. begin
  231.    Temp := Head;
  232.    while not (Temp.Next = AList) do
  233.       Temp := Temp.Next;
  234.    Temp.Next := Temp.Next.Next;
  235.    Head := Temp.Next;
  236.    AList := Head;
  237. end;
  238.  
  239. procedure CreateList(N: Integer);
  240. var
  241.    i: Integer;
  242. begin
  243.    for i := 0 to N - 1 do
  244.       Add(i + 1);
  245.    while not (AList.Next = nil) do
  246.       AList := AList.Next;
  247.    AList.Next := Head;
  248.    AList := Head;
  249. end;
  250.  
  251. procedure TForm1.StartClick(Sender: TObject);
  252. var
  253.    Err, i, Now: Integer;
  254.    Temp: PLinkedList;
  255. begin
  256.    Head := nil;
  257.    Val(NEdit.Text, N, Err);
  258.    Val(MEdit.Text, M, Err);
  259.    if (N < MIN_SIZE) or (N > MAX_SIZE) or (M < MIN_SIZE) or (M > MAX_SIZE) then
  260.       MessageDlg('Введите N и M в указанном диапазоне', mtError, [mbOK], 0)
  261.    else
  262.    begin
  263.       CreateList(N);
  264.       Now := 0;
  265.       Ans := 'Номера в порядке выбывания: ' + #10#13;
  266.       while N > 1 do
  267.       begin
  268.          Inc(Now);
  269.          if Now = M then
  270.          begin
  271.             Ans := Ans + IntToStr(AList.Data) + ' ';
  272.             DeleteList(AList);
  273.             Now := 0;
  274.             Dec(N);
  275.          end
  276.          else
  277.             AList := AList.Next;
  278.       end;
  279.       Ans := Ans + #10#13 + 'Номер последнего оставшегося: ' + IntToStr(AList.Data);
  280.       ShowAns(Ans);
  281.       SaveButton.Enabled := True;
  282.    end;
  283. end;
  284.  
  285. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement