Advertisement
ksyshshot

Lab.4.2___

Mar 4th, 2023
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 17.05 KB | Source Code | 0 0
  1. unit Lab_4_2_Form;
  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;
  8.  
  9. type
  10.   TForm_4_2 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     NFile: TMenuItem;
  13.     NOpenFile: TMenuItem;
  14.     NSaveFile: TMenuItem;
  15.     NInstruction: TMenuItem;
  16.     NAbout: TMenuItem;
  17.     LabelTask: TLabel;
  18.     LabelDeleteOperation: TLabel;
  19.     LabelInsertOperation: TLabel;
  20.     LabelChangeOperation: TLabel;
  21.     ButtonOpenTask: TButton;
  22.     EditDeleteOperation: TEdit;
  23.     EditInsertOperation: TEdit;
  24.     EditChangeOperation: TEdit;
  25.     ButtonFindPrice: TButton;
  26.     LabelFinalPrice: TLabel;
  27.     EditFinalPrice: TEdit;
  28.     OpenDialog1: TOpenDialog;
  29.     SaveDialog1: TSaveDialog;
  30.     LabelSourceString: TLabel;
  31.     EditSourceString: TEdit;
  32.     EditDesiredString: TEdit;
  33.     LabelDesiredString: TLabel;
  34.     procedure NAboutClick(Sender: TObject);
  35.     procedure ButtonOpenTaskClick(Sender: TObject);
  36.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  37.     procedure EditDeleteOperationKeyPress(Sender: TObject; var Key: Char);
  38.     procedure EditInsertOperationKeyPress(Sender: TObject; var Key: Char);
  39.     procedure EditChangeOperationKeyPress(Sender: TObject; var Key: Char);
  40.     procedure NInstructionClick(Sender: TObject);
  41.     procedure EditDeleteOperationChange(Sender: TObject);
  42.     procedure EditInsertOperationChange(Sender: TObject);
  43.     procedure EditChangeOperationChange(Sender: TObject);
  44.     procedure EditSourceStringChange(Sender: TObject);
  45.     procedure EditDesiredStringChange(Sender: TObject);
  46.     procedure ButtonFindPriceClick(Sender: TObject);
  47.     procedure NOpenFileClick(Sender: TObject);
  48.     procedure NSaveFileClick(Sender: TObject);
  49.   private
  50.     { Private declarations }
  51.   public
  52.     { Public declarations }
  53.   end;
  54.  
  55. var
  56.   Form_4_2: TForm_4_2;
  57.  
  58. implementation
  59.  
  60. {$R *.dfm}
  61.  
  62. uses UnitAbout, UnitError, UnitExit, UnitInstruction_4_2, UnitTask_4_2;
  63.  
  64. const
  65.     MAX_VALUE =  1000;
  66.     MIN_VALUE = 0;
  67.     MAX_STR = 200;
  68.     MIN_STR = 1;
  69.  
  70. function DelAndInsert(X, Y: String; I, CostDel, CostIns, Count: Integer; var Price: Integer): Integer;
  71. begin
  72.     if I <= Count then
  73.     begin
  74.         if X[I] <> Y[I] then
  75.         begin
  76.             Delete(X, I, 1);
  77.             Insert(Y[I], X, I);
  78.             Price := Price + CostDel + CostIns;
  79.         end;
  80.         Price := DelAndInsert(X, Y, (I + 1), CostDel, CostIns, Count, Price);
  81.     end;
  82.     DelAndInsert := Price;
  83. end;
  84.  
  85. function ChangeElement(var X, Y: String; I, CostCh, Count: Integer; var Price: Integer): Integer;
  86. begin
  87.     if I <= Count then
  88.     begin
  89.         if X[I] <> Y[I] then
  90.         begin
  91.             X[I] := Y[I];
  92.             Price := Price + CostCh;
  93.         end;
  94.         Price := ChangeElement(X, Y, (I + 1), CostCh, Count, Price);
  95.     end;
  96.     ChangeElement := Price;
  97. end;
  98.  
  99. function FindInterimPrice(X, Y: String; CostDelete, CostInsert, CostChange, Count: Integer): Integer;
  100. var
  101.     I, Answer: Integer;
  102. begin
  103.     Answer := 0;
  104.     if ((CostDelete + CostInsert) < CostChange) then
  105.         FindInterimPrice := DelAndInsert(X, Y, 1, CostDelete, CostInsert, Count, Answer)
  106.     else
  107.         FindInterimPrice := ChangeElement(X, Y, 1, CostChange, Count, Answer);
  108. end;
  109.  
  110. procedure TForm_4_2.ButtonFindPriceClick(Sender: TObject);
  111. var
  112.     X, Y: String[200];
  113.     CostInsert, CostDelete, CostChange, Count, FinalPrice: Integer;
  114.     IsCorrect: Boolean;
  115.     Error: String;
  116. begin
  117.     IsCorrect := true;
  118.     Error := '';
  119.     FinalPrice := 0;
  120.     Try
  121.         CostDelete := StrToInt(EditDeleteOperation.Text);
  122.         if (CostDelete > MAX_VALUE) or (CostDelete < MIN_VALUE) then
  123.         begin
  124.             IsCorrect := false;
  125.             Error := 'Цена удаления элемента не входит в допустимый диапазон. ';
  126.         end;
  127.         CostInsert := StrToInt(EditInsertOperation.Text);
  128.         if (CostInsert > MAX_VALUE) or (CostInsert < MIN_VALUE) then
  129.         begin
  130.             IsCorrect := false;
  131.             Error := Error + 'Цена вставки элемента не входит в допустимый диапазон. ';
  132.         end;
  133.         CostChange := StrToInt(EditChangeOperation.Text);
  134.         if (CostChange > MAX_VALUE) or (CostChange < MIN_VALUE) then
  135.         begin
  136.             IsCorrect := false;
  137.             Error := Error + 'Цена замены элемента не входит в допустимый диапазон. ';
  138.         end;
  139.         X := EditSourceString.Text;
  140.         if (Length(X) > MAX_STR) or (Length(X) < MIN_STR) then
  141.         begin
  142.             IsCorrect := false;
  143.             Error := 'Длина исходной строки не входит в допустимый диапазон. ';
  144.         end;
  145.         Y := EditDesiredString.Text;
  146.         if (Length(Y) > MAX_STR) or (Length(Y) < MIN_STR) then
  147.         begin
  148.             IsCorrect := false;
  149.             Error := 'Длина желаемой строки не входит в допустимый диапазон. ';
  150.         end;
  151.     Except
  152.         IsCorrect := false;
  153.         Error := Error + 'Некорректно введено одно из значений цены. ';
  154.     End;
  155.     if (IsCorrect) then
  156.     begin
  157.         if (Length(X) = Length(Y)) then
  158.         begin
  159.             Count := Length(Y);
  160.             FinalPrice :=  FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count);
  161.         end
  162.         else
  163.         begin
  164.             if Length(X) < (Length(Y)) then
  165.             begin
  166.                 Count := Length(X);
  167.                 FinalPrice := FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count);
  168.                 FinalPrice := FinalPrice + CostInsert * (Length(Y) - Length(X));
  169.             end
  170.             else
  171.             begin
  172.                 Count := Length(Y);
  173.                 FinalPrice := FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count);
  174.                 FinalPrice := FinalPrice + CostDelete * (Length(X) - Length(Y));
  175.             end;
  176.         end;
  177.         EditFinalPrice.Text := IntToStr(FinalPrice);
  178.         NSaveFile.Enabled := true;
  179.     end
  180.     else
  181.     begin
  182.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  183.         UnitError.FormError.ShowModal();
  184.         UnitError.FormError.LabelError.Caption := '';
  185.     end;
  186. end;
  187.  
  188. procedure TForm_4_2.ButtonOpenTaskClick(Sender: TObject);
  189. begin
  190.     UnitTask_4_2.FormTask_4_2.ShowModal();
  191. end;
  192.  
  193. procedure TForm_4_2.EditChangeOperationChange(Sender: TObject);
  194. begin
  195.     if (EditDeleteOperation.Text = '') or (EditInsertOperation.Text = '')
  196.     or (EditSourceString.Text = '') or (EditDesiredString.Text = '')
  197.     or (EditChangeOperation.Text = '') then
  198.         ButtonFindPrice.Enabled := false
  199.     else
  200.         ButtonFindPrice.Enabled := true;
  201.     EditFinalPrice.Text := '';
  202. end;
  203.  
  204. procedure TForm_4_2.EditChangeOperationKeyPress(Sender: TObject; var Key: Char);
  205. begin
  206.     if not(Key in [#8, #13, '0'..'9']) then
  207.         Key := #0;
  208.     if (Length(EditChangeOperation.Text) = 0) and (Key in [#13, '0']) then
  209.         Key := #0;
  210.     if (Length(EditChangeOperation.Text) = 1) and not(EditChangeOperation.Text[1] = '1') then
  211.         EditChangeOperation.MaxLength := 3;
  212.     if (Length(EditChangeOperation.Text) = 3) and not(EditChangeOperation.Text = '100') then
  213.         EditChangeOperation.MaxLength := 3
  214.     else
  215.         EditChangeOperation.MaxLength := 4;
  216.     if (Length(EditChangeOperation.Text) = 3) and (EditChangeOperation.Text = '100') and not(Length(EditChangeOperation.SelText) > 0) and not(Key in ['0', #8, #13]) then
  217.         Key := #0;
  218.     if (Length(EditChangeOperation.SelText) > 0) and (Key = '0') then
  219.         Key := #0;
  220.     //if (Length(EditChangeOperation.Text) > 0) and (Key = #13) then
  221.     //    ButtonFindAnswerClick(Sender);
  222. end;
  223.  
  224. procedure TForm_4_2.EditDeleteOperationChange(Sender: TObject);
  225. begin
  226.     if (EditInsertOperation.Text = '') or (EditChangeOperation.Text = '')
  227.     or (EditSourceString.Text = '') or (EditDesiredString.Text = '')
  228.     or (EditDeleteOperation.Text = '') then
  229.         ButtonFindPrice.Enabled := false
  230.     else
  231.         ButtonFindPrice.Enabled := true;
  232.     EditFinalPrice.Text := '';
  233. end;
  234.  
  235. procedure TForm_4_2.EditDeleteOperationKeyPress(Sender: TObject; var Key: Char);
  236. begin
  237.     if not(Key in [#8, #13, '0'..'9']) then
  238.         Key := #0;
  239.     if (Length(EditDeleteOperation.Text) = 0) and (Key in [#13, '0']) then
  240.         Key := #0;
  241.     if (Length(EditDeleteOperation.Text) = 1) and not(EditDeleteOperation.Text[1] = '1') then
  242.         EditDeleteOperation.MaxLength := 3;
  243.     if (Length(EditDeleteOperation.Text) = 3) and not(EditDeleteOperation.Text = '100') then
  244.         EditDeleteOperation.MaxLength := 3
  245.     else
  246.         EditDeleteOperation.MaxLength := 4;
  247.     if (Length(EditDeleteOperation.Text) = 3) and (EditDeleteOperation.Text = '100') and not(Length(EditDeleteOperation.SelText) > 0) and not(Key in ['0', #8, #13]) then
  248.         Key := #0;
  249.     if (Length(EditDeleteOperation.SelText) > 0) and (Key = '0') then
  250.         Key := #0;
  251.     //if (Length(EditDeleteOperation.Text) > 0) and (Key = #13) then
  252.     //    ButtonFindPrice(Sender);
  253. end;
  254.  
  255. procedure TForm_4_2.EditDesiredStringChange(Sender: TObject);
  256. begin
  257.     if (EditDeleteOperation.Text = '') or (EditInsertOperation.Text = '')
  258.     or (EditChangeOperation.Text = '') or (EditSourceString.Text = '')
  259.     or (EditDesiredString.Text = '') then
  260.         ButtonFindPrice.Enabled := false
  261.     else
  262.         ButtonFindPrice.Enabled := true;
  263.     EditFinalPrice.Text := '';
  264. end;
  265.  
  266. procedure TForm_4_2.EditInsertOperationChange(Sender: TObject);
  267. begin
  268.     if (EditDeleteOperation.Text = '') or (EditChangeOperation.Text = '')
  269.     or (EditSourceString.Text = '') or (EditDesiredString.Text = '')
  270.     or (EditInsertOperation.Text = '') then
  271.         ButtonFindPrice.Enabled := false
  272.     else
  273.         ButtonFindPrice.Enabled := true;
  274.     EditFinalPrice.Text := '';
  275. end;
  276.  
  277. procedure TForm_4_2.EditInsertOperationKeyPress(Sender: TObject; var Key: Char);
  278. begin
  279.     if not(Key in [#8, #13, '0'..'9']) then
  280.         Key := #0;
  281.     if (Length(EditInsertOperation.Text) = 0) and (Key in [#13, '0']) then
  282.         Key := #0;
  283.     if (Length(EditInsertOperation.Text) = 1) and not(EditInsertOperation.Text[1] = '1') then
  284.         EditInsertOperation.MaxLength := 3;
  285.     if (Length(EditInsertOperation.Text) = 3) and not(EditInsertOperation.Text = '100') then
  286.         EditInsertOperation.MaxLength := 3
  287.     else
  288.         EditInsertOperation.MaxLength := 4;
  289.     if (Length(EditInsertOperation.Text) = 3) and (EditInsertOperation.Text = '100') and not(Length(EditInsertOperation.SelText) > 0) and not(Key in ['0', #8, #13]) then
  290.         Key := #0;
  291.     if (Length(EditInsertOperation.SelText) > 0) and (Key = '0') then
  292.         Key := #0;
  293.     //if (Length(EditInsertOperation.Text) > 0) and (Key = #13) then
  294.     //    ButtonFindAnswerClick(Sender);
  295. end;
  296.  
  297. procedure TForm_4_2.EditSourceStringChange(Sender: TObject);
  298. begin
  299.     if (EditDeleteOperation.Text = '') or (EditInsertOperation.Text = '')
  300.     or (EditChangeOperation.Text = '') or (EditDesiredString.Text = '')
  301.     or (EditSourceString.Text = '') then
  302.         ButtonFindPrice.Enabled := false
  303.     else
  304.         ButtonFindPrice.Enabled := true;
  305.     EditFinalPrice.Text := '';
  306. end;
  307.  
  308. procedure TForm_4_2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  309. Var
  310.     Res: Integer;
  311. begin
  312.     Res := UnitExit.FormExit.ShowModal();
  313.     If Res = mrOk Then
  314.         CanClose := True
  315.     Else
  316.         CanClose := False;
  317. end;
  318.  
  319. procedure TForm_4_2.NAboutClick(Sender: TObject);
  320. begin
  321.     UnitAbout.FormAbout.ShowModal();
  322. end;
  323.  
  324. procedure TForm_4_2.NInstructionClick(Sender: TObject);
  325. begin
  326.     UnitInstruction_4_2.FormInstruction.ShowModal();
  327. end;
  328.  
  329. procedure TForm_4_2.NOpenFileClick(Sender: TObject);
  330. var
  331.     F: TextFile;
  332.     Path, Error, SourceStr, DesiredStr: String;
  333.     CostDelete, CostInsert, CostChange: Integer;
  334.     IsCorrect: Boolean;
  335. begin
  336.     IsCorrect := true;
  337.     Error := '';
  338.     if OpenDialog1.Execute() then
  339.     begin
  340.         Path := OpenDialog1.FileName;
  341.         AssignFile(F, Path);
  342.         try
  343.             Reset(F);
  344.             try
  345.                 Readln(F, CostDelete);
  346.                 if (CostDelete < MIN_VALUE) or (CostDelete > MAX_VALUE) then
  347.                 begin
  348.                     IsCorrect := false;
  349.                     Error := Error + 'Значение цены удаления элемента не входит в допустимый диапазон. ';
  350.                 end;
  351.                 if EoF(F) then
  352.                 begin
  353.                     IsCorrect := false;
  354.                     Error := 'В файле недостаточно элементов. ';
  355.                 end
  356.                 else
  357.                     Readln(F, CostInsert);
  358.                 if (CostInsert < MIN_VALUE) or (CostInsert > MAX_VALUE) then
  359.                 begin
  360.                     IsCorrect := false;
  361.                     Error := Error + 'Значение цены вставки элемента не входит в допустимый диапазон. ';
  362.                 end;
  363.                 if EoF(F) then
  364.                 begin
  365.                     IsCorrect := false;
  366.                     Error := 'В файле недостаточно элементов. ';
  367.                 end
  368.                 else
  369.                     Readln(F, CostChange);
  370.                 if (CostChange < MIN_VALUE) or (CostChange > MAX_VALUE) then
  371.                 begin
  372.                     IsCorrect := false;
  373.                     Error := Error + 'Значение цены замены элемента не входит в допустимый диапазон. ';
  374.                 end;
  375.                 if EoF(F) then
  376.                 begin
  377.                     IsCorrect := false;
  378.                     Error := 'В файле недостаточно элементов. ';
  379.                 end
  380.                 else
  381.                     Readln(F, SourceStr);
  382.                 if (length(SourceStr) < MIN_STR) or (length(SourceStr) > MAX_STR) then
  383.                 begin
  384.                     IsCorrect := false;
  385.                     Error := Error + 'Длина исходной строки не входит в диапазон допустимых значений. ';
  386.                 end;
  387.                 if EoF(F) then
  388.                 begin
  389.                     IsCorrect := false;
  390.                     Error := 'В файле недостаточно элементов. ';
  391.                 end
  392.                 else
  393.                     Readln(F, DesiredStr);
  394.                 if (length(DesiredStr) < MIN_STR) or (length(DesiredStr) > MAX_STR) then
  395.                 begin
  396.                     IsCorrect := false;
  397.                     Error := Error + 'Длина желаемой строки не входит в диапазон допустимых значений. ';
  398.                 end;
  399.                 if not(EoF(F)) then
  400.                 begin
  401.                     IsCorrect := false;
  402.                     Error := 'В файле найдены лишние элементы. ';
  403.                 end;
  404.             except
  405.                 IsCorrect := false;
  406.                 Error := 'Найдено некорректное значение в файле. ';
  407.             end;
  408.             CloseFile(F);
  409.         except
  410.             IsCorrect := False;
  411.             Error := Error + 'Нет доступа к файлу';
  412.         end;
  413.     end;
  414.     if not(IsCorrect) then
  415.     begin
  416.         UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  417.         UnitError.FormError.ShowModal();
  418.         UnitError.FormError.LabelError.Caption := '';
  419.     end
  420.     else
  421.     begin
  422.         EditDeleteOperation.Text := IntToStr(CostDelete);
  423.         EditInsertOperation.Text := IntToStr(CostInsert);
  424.         EditChangeOperation.Text := IntToStr(CostChange);
  425.         EditSourceString.Text := UTF8ToAnsi(SourceStr);
  426.         EditDesiredString.Text := UTF8ToAnsi(DesiredStr);
  427.     end;
  428. end;
  429.  
  430. procedure TForm_4_2.NSaveFileClick(Sender: TObject);
  431. var
  432.     SaveFile: TextFile;
  433.     SavePath, Error: String;
  434.     Answer: Integer;
  435.     IsCorrect: Boolean;
  436. begin
  437.     IsCorrect := True;
  438.     Error := '';
  439.     if SaveDialog1.Execute() then
  440.     begin
  441.         SavePath := SaveDialog1.FileName;
  442.         AssignFile(SaveFile, SavePath);
  443.         Try
  444.             Rewrite(SaveFile);
  445.             Try
  446.                 Writeln(SaveFile, 'Полученная стоимость: ', EditFinalPrice.Text);
  447.             Finally
  448.                 CloseFile(SaveFile);
  449.             End;
  450.         Except
  451.             IsCorrect := False;
  452.             Error := 'Нет доступа к файлу';
  453.         End;
  454.         if not(IsCorrect) then
  455.         begin
  456.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  457.             UnitError.FormError.ShowModal();
  458.             UnitError.FormError.LabelError.Caption := '';
  459.         end
  460.         else
  461.             NSaveFile.Enabled := false;
  462.     end;
  463. end;
  464.  
  465. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement